У меня есть базовый класс (MyBase
) с множеством возможных производных классов (в этом примере MyDerived
и MyDerived2
). По пути List<MyBase>
передается другому классу, а затем этому классу необходимо вызвать конструктор еще одного класса ... который вызывается, полностью зависит от того, что в List
.
Я могу использовать Reflection, чтобы найти конструктор, но только если где-то по пути я сделаю что-то вроде:
var r = baseList.ConvertAll(x => (MyDerived1)x);
Так что r
содержит List<MyDerived1>
, и я могу найти конструктор с помощью Reflection. Конечно, это глупо, потому что я мог бы просто запечь конструктор, так как я пытаюсь запечь в MyDerived1
в этом ConvertAll
утверждении. Но это один производный класс, и у меня есть десятки.
Я хочу, чтобы метод RunTest()
вызывал правильный конструктор, полностью основываясь на том, что он находит в List<MyBase>
во время выполнения. С практической точки зрения хорошо посмотреть на первый объект в списке, поскольку они всегда будут одного типа.
Возможно ли это? Как?
namespace Classtest
{
class Program
{
static void Main(string[] args)
{
Test t = new Test( new List<MyBase>() {
new MyDerived1(),
new MyDerived1() } );
t.RunTest();
}
}
public class Test
{
List<MyBase> baseList;
public Test(List<MyBase> bl)
{
baseList = bl;
}
public void RunTest()
{
// I would like the CreateInstance to figure out which constructor
// to call based on what it finds in baseList,
// without having to indicate "MyDerived1" here.
// This works, but I'd rather have it figure this out at
// runtime for every single possible derived class...
var r = baseList.ConvertAll(x => (MyDerived1)x);
Object o = Activator.CreateInstance(typeof(CallMe),
new object[] { r });
}
}
public class CallMe
{
public CallMe(List<MyDerived1> myDerived)
{
Console.WriteLine("Found it.");
}
public CallMe(List<MyDerived2> myDerived)
{
Console.WriteLine("Wrong one!");
}
}
public class MyBase
{ }
public class MyDerived1 : MyBase
{ }
public class MyDerived2 : MyBase
{ }
}