2009-09-14 3 views
0

У меня есть различные объекты разных типов. Для всех них я хочу вызвать статический метод своего класса. Все классы используют один и тот же метод. Как я могу вызвать этот статический метод без явного вызова класса?C# статический метод от объекта

+0

Не могли бы вы дать нам еще какой-нибудь контекст? –

ответ

0

Вы хотите вызвать каждый метод на каждом из отдельных классов? Вы должны вызывать их явно, ссылаясь на каждый класс отдельно.

Стационарный метод для каждого класса имеет один и тот же общий код? Поместите его в статический класс для использования всеми другими классами или создайте один или несколько методов расширения.

1

Если эти классы расширяют один и тот же базовый класс, то вызов метода в базовом классе будет работать.

Например:

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

public class A: Base 
{ 
} 

public class B: Base 
{ 
} 

следующих вызовов метода выполняет один и тот же код:

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

Вы можете выполнить это, поставив метод в каждом объекте, который вызывает соответствующий статический метод. Однако тот факт, что вы хотите сделать это, говорит о том, что ваш дизайн может быть улучшен. Если вы скажете нам, что вы пытаетесь сделать, кто-то может предложить лучший подход.

0

Вы ищете что-то вроде List<object>, где у всех объектов есть статический метод с именем, например MethodX()?

Если это так, вы можете подумать о них, найти имя метода и выполнить его.

Либо это, либо наследование, как и другие упоминания (что было бы правильным путем).

0

Если вам нужно иметь конкретную реализацию для каждого типа, я не думаю, что статический метод является правильным подходом ... Вместо этого вы определяете интерфейс, реализованный всеми вашими классами. После этого вы можете вызвать метод экземпляра, определенный с помощью интерфейса на каждом объекте:

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 
    } 
} 

Конечно, если вы не нужны конкретные реализации для каждого типа, то вы можете просто позвонить Base.DoSomething (как объяснил Дэвид)

0

Я не уверен, что именно вы пытаетесь сделать. Но, используя свое воображение, я придумываю эту реализацию.

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"); 
    } 
} 
Смежные вопросы