2009-09-14 10 views
0

J'ai différents objets de types différents. Pour chacun d'eux, je veux appeler une méthode statique de leur classe. Toutes les classes partagent la même méthode. Comment puis-je appeler cette méthode statique sans appeler explicitement la classe?Méthode statique C# à partir de l'objet

+0

Pourriez-vous nous donner plus de contexte? –

Répondre

0

Vous souhaitez appeler chaque méthode sur chacune des classes individuelles? Vous devez les appeler explicitement, en référençant chaque classe individuellement.

La méthode statique de chaque classe a-t-elle le même code commun? Placez-le dans une classe statique à utiliser par toutes les autres classes ou créez une ou plusieurs méthodes d'extension.

1

Si ces classes étendent toutes la même classe de base, l'appel de la méthode sur la classe de base fonctionnera.

Par exemple:

public class Base 
{ 
    public static DoSomething() 
    { 
    //something 
    } 
} 

public class A: Base 
{ 
} 

public class B: Base 
{ 
} 

Les appels de méthode suivants execute le même code:

A.DoSomething(); 
B.DoSomething(); 
Base.DoSomething(); 
3

Vous pouvez accomplir cela en mettant une méthode dans chaque objet qui appelle la méthode statique correspondante. Cependant, le fait que vous vouliez faire cela suggère que votre conception pourrait être améliorée. Si vous nous disiez ce que vous essayez d'accomplir, quelqu'un pourrait proposer une meilleure approche.

0

Est-ce que vous cherchez quelque chose comme vous avez quelque chose comme List<object> où tous les objets sont garantis d'avoir une méthode statique nommée, par exemple MethodX()?

Si oui, vous pouvez réfléchir sur eux, recherchez le nom de la méthode et l'exécuter.

Soit cela ou l'héritage comme les autres mentionnent (ce qui serait la bonne façon d'y aller).

0

Si vous avez besoin d'une implémentation spécifique pour chaque type, je ne pense pas qu'une méthode statique soit la bonne approche ... Au lieu de cela, vous devez définir une interface implémentée par toutes vos classes. Vous pouvez ensuite appeler la méthode d'instance définie par l'interface sur chaque objet:

public interface IDoSomething 
{ 
    void DoSomething(); 
} 

public class A: IDoSomething 
{ 
    public void DoSomething() 
    { 
     // implementation for A 
    } 
} 

public class B: IDoSomething 
{ 
    public void DoSomething() 
    { 
     // implementation for B 
    } 
} 

Bien sûr, si vous n'avez pas besoin d'une mise en œuvre spécifique pour chaque type, vous pouvez simplement appeler Base.DoSomething (comme expliqué par David)

0

Je ne sais pas exactement ce que vous essayez de faire. Mais en utilisant mon imagination, je viens avec cette mise en œuvre.

internal class Program 
{ 
    private static void Main(string[] args) 
    { 
    var staticMethodClasses = new List<StaticMethodClassBase> 
             {new ClassA(), new ClassB()}; 

    foreach (StaticMethodClassBase item in staticMethodClasses) 
    { 
     Type t = item.GetType(); 
     MethodInfo staticMethod = 
      t.GetMethod("DoSomething", BindingFlags.Static | BindingFlags.Public); 
     staticMethod.Invoke(null, null); 
    } 
    } 
} 

public abstract class StaticMethodClassBase 
{ 
} 

public class ClassA : StaticMethodClassBase 
{ 
    public static void DoSomething() 
    { 
     Console.WriteLine("Class A"); 
    } 
} 

public class ClassB : StaticMethodClassBase 
{ 
    public static void DoSomething() 
    { 
     Console.WriteLine("Class B"); 
    } 
} 
Questions connexes