2013-04-30 2 views
2

Мне было интересно, можно ли (даже через отражение et similia) получить производный класс вызывающего абонента внутри статического метода называемого базового класса.Получить вызывающий вызывающий класс при вызове статического метода базового класса

Например, У меня есть базовый класс со статическим методом, определенный:

public MyBaseClass { 
    public static void MyBaseClassStaticMethod() { /** ... **/ } 
} 

и производным-от-него класс:

public MyDerivedClass : MyBaseClass { } 

тогда я назвать:

MyDerivedClass.MyBaseClassStaticMethod() 

Возможно ли, внутри метода MyBaseClassStaticMethod, знать, что является номером . pe?
(т.е. MyDerivedClass)

Я просто нужна строка ...

+0

Это совершенно невозможно. – SLaks

+0

@SLaks хорошо, «совершенно» невозможно, не совсем верно - вы могли бы сканировать стековые фреймы, например. Но нет * хорошего * подхода к нему –

+0

@MarcGravell: Как это будет работать? Трассировка стека не содержит намека на «MyDerivedClass». –

ответ

3

Нет, это невозможно - ни в коем случае. static методы не являются полиморфными, и поэтому такой информации просто не существует.
Рассмотрите возможность изменения кода.

Update:

После компиляции, компилятор заменяет MyDerivedClass с классом статический метод фактически объявленной, в вашем случае MyBaseClass.
Так что даже в IL вы не видите MyDerivedClass. Информация существует только в вашем исходном коде. Это не существует в вашей сборной сборке.

+0

Спасибо. Фактически это только попытка выполнить проверку времени на ошибки программистов при использовании этой библиотеки. Я могу обойтись. – Teejay

+0

Это правильный ответ и хорошо объясненный. Другие ответы пытаются обойти это ограничение, изменяя требования OP. –

-1

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

Если вы передали 'this' в качестве параметра статическому методу, вы можете попробовать выполнить его следующим образом. Предположим, у вас есть несколько производных классов, которые вы хотите проверить.

public static void MyBaseClassStaticMethod(MyBaseClass callingInstance) 
{ 
    MyDerivedClass myDerivedClass = callingInstance as MyDerivedClass; 
    MyDerivedClass2 myDerivedClass2 = callingInstance as MyDerivedClass2; 
    MyDerivedClass3 myDerivedClass3 = callingInstance as MyDefivedClass3; 
    ... 

    // test for which derived class is calling 
    if (myDerivedClass != null) 
     ... 
    else if (myDerivedClass2 != null) 
     ... 

    ... 
} 
+0

Вопрос не о экземпляре 'this'. – Teejay

3

Дженерики в следующим образом могут быть использованы для решения вашего сценария

public class BaseClass<TDerived> where TDerived : BaseClass<TDerived> 
{ 
    public static void LogCallerType() 
    { 
     Console.WriteLine(typeof(TDerived).Name); 
    } 
} 

public class FooClass : BaseClass<FooClass> { } 

public class BooClass : BaseClass<BooClass> { } 

class Program 
{ 
    static void Main(string[] args) 
    { 
     FooClass.LogCallerType(); 
     BooClass.LogCallerType(); 
    } 
} 

Это, в свою очередь, выход следующих

1. FooClass 
2. BooClass 
+0

Аналогичный ответ на http://stackoverflow.com/a/5012880/448568 –

+0

Это будет поцарапать зуд, который у меня уже довольно долго пытается получить контекст вызова C# так же, как вы можете получить к нему доступ в Javascript , –

+0

Удивительное решение !!! Thx для обмена. – BrilBroeder