Вы не можете использовать дженерики для создания подобного объекта. Вы можете ограничить универсальные типы следующим образом:
public static void dostuff<T, U> (List<T> items) where T : SomeClass where U : SomethingElse
{
}
Но это позволит вам получить доступ только к членам этих классов / интерфейсов, а не к конструкторам.
Чтобы расширить ответ Джоэла, вы должны добавить метод к интерфейсу T (в моем примере SomeClass), который принимает объект T и возвращает новый объект U. Примерно так:
public class SomeClass
{
CreateInstanceOfSomethingElse() { return new SomethingElse(this); }
}
public static void dostuff<T, U> (List<T> items) where T : SomeClass, U : SomethingElse
{
foreach (T item in items)
{
func(item.CreateInstanceOfSomethingElse().SpecialMember);
}
}
В качестве другого совершенно другого подхода вы можете указать, что метод doStuff также принимает Func<T, U>
, который должен создавать U из объекта T.
public static void dostuff<T, U> (List<T> items, Func<T, U> createU)
{
foreach (T item in items)
{
func(createU(item).SpecialMember);
}
}
Это запутывается, если создание вашего объекта является чем-то более сложным, чем простая ламба, подобная
t => new U(t)