πŸš€ go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: borland.public.csharpbuilder.language.csharp
Article #137

Re: More about "class of" in C#

#137
From: Joanna Carter [TeamB]
Date: Tue, 19 Jun 2007 10:57
134 lines
4394 bytes
Borland a οΏ½crit :

> Referring to that posting from December last year re "class of"... I 
> understand the use of Activator.CreateInstance(ClassType) as a replacement 
> for the Delphi "class of" for use in a C# abstract class factory, but how 
> would I use that ClassType reference to call a static method (eg public 
> static DoIt()) which has been declared in the Class class?
> 
> In Delphi I would simply retrieve the "class of" reference, (eg ClassClass - 
> class of TClass), and call the function normally - eg 
> TClass(ClassClass).DoIt; 

First, can I ask you to change your posting name from Borland ?

Now, to the matter in hand.

Don't forget that, in C#, static methods cannot be virtual. Therefore, 
you have to redlclare the method in each and every derived class but 
simply calling the static method on the base type will only call that 
method, not the derived one.

However, here is a simple example fo how to create a factory class that 
will call the correct method, depending on the type passed in.

   public class Base
   {
     public static void DoIt(int arg) { }
   }

   public class Derived : Base
   {
     public static void DoIt(int arg) { }
   }

   public static class Factory
   {
     public static void DoIt(Type type, int arg)
     {
       if (!typeof(Base).IsAssignableFrom(type))
         throw new Exception("Type must derive from Base");

       Type[] argTypes = new Type[] { typeof(int) };

       MethodInfo mi = type.GetMethod("DoIt", argTypes);

       object[] args = new object[] { arg };

       mi.Invoke(null, args);
     }
   }

     private void button1_Click(object sender, EventArgs e)
     {
       Type type = typeof(Derived);

       Factory.DoIt(type, 123);
     }

You can also use the idea of a metaclass to achieve a more Delphi-like 
syntax.

   public class Base
   {
     #region metaclass

     public class ClassReference
     {
       #region private members

       private Type internalType;

       #endregion

       public void DoIt(int value)
       {
         MethodInfo methodInfo = internalType.GetMethod("DoIt", 
BindingFlags.Public | BindingFlags.Static);

         object[] args = new object[] { value };

         methodInfo.Invoke(null, args);
       }

       #endregion

       #region constructors

       // default constructor
       private ClassReference(Type type)
       {
         internalType = type;
       }

       #endregion

       #region implicit conversion operator

       public static implicit operator ClassReference(Type input)
       {
         if (!typeof(Shape).IsAssignableFrom(input))
           throw new ArgumentException(String.Format("Type {0} must 
derive from {1}", input.Name, typeof(Base).Name), "input");

         return new ClassReference(input);
       }

       #endregion
     }

     #endregion

     public static void DoIt(int value) {...}
   }

   public class Derived : Base
   {
     public static void DoIt() {...}
   }

This then allows the following calling syntax :

   {
     Base.ClassReference classRef = typeof(Derived);

     classRef.DoIt(123);
   }

Is that what you are looking for ?

Joanna

-- 
Joanna Carter [TeamB]
Consultant Software Engineer
Technical Details
Message-ID: <4677b67f@newsgroups.borland.com>
Path: arc1-ca.pugleaf.net!g2news1.google.com!news2.google.com!border1.nntp.dca.giganews.com!border2.nntp.dca.giganews.com!nntp.giganews.com!newspeer1.nwr.nac.net!newsfeeds.ihug.co.nz!ihug.co.nz!newsgroups.borland.com!not-for-mail
References: <467757d6$1@newsgroups.borland.com>

Show Full Headers
Complete Article Headers
X-Google-Thread: 1efe35,77a80b77cf3a9a3e
X-Google-Attributes: gid1efe35,public,usenet
X-Google-Language: ENGLISH,ASCII
Date: Tue, 19 Jun 2007 11:57:01 +0100
From: "Joanna Carter [TeamB]" <joanna@nospam.for.me>
Organization: Carter Consulting
User-Agent: Thunderbird 2.0.0.4 (Macintosh/20070604)
MIME-Version: 1.0
Newsgroups: borland.public.csharpbuilder.language.csharp
Subject: Re: More about "class of" in C#
References: <467757d6$1@newsgroups.borland.com>
In-Reply-To: <467757d6$1@newsgroups.borland.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 8bit
NNTP-Posting-Host: 82.69.239.102
Message-ID: <4677b67f@newsgroups.borland.com>
X-Trace: newsgroups.borland.com 1182250623 82.69.239.102 (19 Jun 2007 03:57:03 -0700)
Lines: 134
X-Authenticated-User: jcarter
Path: arc1-ca.pugleaf.net!g2news1.google.com!news2.google.com!border1.nntp.dca.giganews.com!border2.nntp.dca.giganews.com!nntp.giganews.com!newspeer1.nwr.nac.net!newsfeeds.ihug.co.nz!ihug.co.nz!newsgroups.borland.com!not-for-mail
X-Original-Bytes: 4255