Вы просто не можете использовать C# дженерики так, как вы пытаетесь сделать в вашем фрагменте кода.
Для использования [C#] дженериков фактический тип объекта должен быть известен во время компиляции.
Вы пытаетесь динамически передать тип объекта в качестве параметра типа. Это просто невозможно.
Редактировать
Да, можно динамически создавать общие объекты с помощью отражения. В конце концов, generics реализуется как как построение Cycle-time C#, так и как функция .NET framework (в отличие от, скажем, Java, где это только функция времени компиляции, основанная на тире Erasure). Таким образом, в .NET посредством рефлексии можно реализовать последнее «обход» первого (что, опять же, было бы невозможно в Java).
Но ОП явно не нуждается в этом.
В конце концов, entries
является List<IEntry>
. IOW, контейнер entries
не «знает» конкретный тип его элементов (поскольку он связан с интерфейсом). Таким образом, если каждый элемент будет добавлять уже реализует IEntry
, то это будет достаточно:
void Foo(params IEntry[] objects)
{
var entries = new List<IEntry>();
foreach(var o in objects)
{
entries.Add(o);
}
...
}
Ото, если эти объекты не реализуют IEntry
, то OP просто нужен список чистый, обычный, старой школы, из нетипизированных объекты:
void Foo(params object[] objects)
{
var entries = new List<object>();
foreach(var o in objects)
{
entries.Add(o);
}
...
}
Таким образом с помощью отражения для того, чтобы динамически создать универсальный контейнер, даже если это возможно, кажется слишком сложным для этого конкретного случая использования.
Это лучшая практика: 'Activator.CreateInstance (typeof (Entry <>). MakeGe nericType (o.GetType())); '? –
Так как вы все равно рассматриваете объект как универсальный IEntry, зачем вообще использовать дженерики? – dtb
Это только на данный момент, позже пользователь может определить общий аргумент с свойством IEntry.Type. Не кажется вам приятным, я полагаю, однако, я не могу дать весь контекст. –