Более конкретный тип из базового общего конструктора - PullRequest
0 голосов
/ 26 ноября 2010

Как получить с помощью отражения наиболее общий тип из общего конструктора в базовом классе:

Public Class Foo()
   Shared Sub New()
       'Here we have code to get the type!
        MethodBase.GetCurrentMethod().DeclaringType
   End
End Class

Public Class Bar()
  Inherits Foo

End Class

Я ожидаю, что результатом будет тип Bar, а не Foo.Возможно ли это?

1 Ответ

2 голосов
/ 26 ноября 2010

Во-первых, кажется, вы хотите найти самый производный тип (или самый специфический тип), а не самый универсальный тип - что скорее означало бы противоположность (либо , что дженерики задействованы или что ищется самый общий тип).

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

Во-первых, конструкторы не являются виртуальными методами, поэтому внутри конструктора (IIRC) ссылка на объект Me имеет тип, который содержит этот конструктор.

Что вы можете сделать, так это отразить все типы сборки и найти все те, которые получены из Foo. Затем вам нужно будет построить график наследования этих типов и назначить каждому число, говорящее о том, как далеко оно получено из Foo (количество уровней наследования). Затем вы можете проверить ссылку на объект Me по всем идентифицированным вами типам (посмотрите, можно ли привести Me к каждому из них), и из этого подмножества выбрать один тип с наибольшим числом уровней наследования. .

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...