Получить тип класса? - PullRequest
       1

Получить тип класса?

3 голосов
/ 10 октября 2010

Учитывая

public class A
{
    public static void Foo()
    {
        // get typeof(B)
    }
}

public class B : A
{

}

Возможно ли для B.Foo() получить typeof(B) в .NET 4?Обратите внимание, что Foo является статическим.

Ответы [ 2 ]

4 голосов
/ 10 октября 2010

Нет разницы между A.Foo() и B.Foo(). Компилятор отправляет вызов A.Foo() в обоих случаях. Таким образом, нет, невозможно определить, был ли Foo назван A.Foo() или B.Foo().

3 голосов
/ 10 октября 2010

К сожалению, это невозможно, , как объясняет dtb .

Одной из альтернатив является создание A общего вида следующим образом:

public class A<T>
{
    public static void Foo()
    {
        // use typeof(T)
    }
}

public class B : A<B>
{
}

Другая возможность состоит в том, чтобы сделать метод A.Foo универсальным, а затем предоставить методы-заглушки в производных типах, которые затем вызывают «базовую» реализацию.

Я не заинтересован в этом паттерне. Это, вероятно, имеет смысл только в том случае, если вам абсолютно необходимо соблюдать соглашение о вызовах B.Foo, вы не можете сделать сам A универсальным, и у вас внутри A.Foo есть много общей логики, которую вы не хотите повторять в своих производных типы.

public class A
{
    protected static void Foo<T>()
    {
        // use typeof(T)
    }
}

public class B : A
{
    public static void Foo()
    {
        A.Foo<B>();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...