В моей программе у меня есть класс A
, который расширен на B
, C
и многие другие классы. У меня есть метод GetInstance()
, который возвращает экземпляр B
или C
(или одного из других дочерних элементов), но я не знаю, какой из них, поэтому тип возвращаемого метода - A
.
В методе CreateGenericList()
у меня есть переменная v
типа A
, которая на самом деле является либо B
, C
, либо другим дочерним типом, и я хочу создать общий список правильный тип, то есть List<B>
, если v
является B
или List<C>
, если v
является C
, ...
В настоящее время я делаю это с помощью отражения, которое работает, но это очень медленно. Я хотел знать, есть ли другой способ сделать это, который не использует отражение.
Вот пример кода моей проблемы:
class A { }
class B : A { }
class C : A { }
// More childs of A.
class Program
{
static A GetInstance()
{
// returns an instance of B or C
}
static void CreateGenericList()
{
A v = Program.GetInstance();
IList genericList = // Here I want an instance of List<B> or List<C> or ... depending of the real type of v, not a List<A>.
}
}
Я попробовал следующий взлом. Я вызываю следующий метод, надеясь, что механизм вывода типов угадывает тип model
, но он не работает и возвращает List<A>
. Я считаю, что поскольку c # статически типизирован, T
разрешается как A
, а не как реальный тип model
во время выполнения.
static List<T> CreateGenericListFromModel<T>(T model) where T : A
{
return new List<T> ();
}
Есть ли у кого-нибудь решение этой проблемы, которое не использует отражение или что невозможно решить эту проблему без отражения?
Большое спасибо.