我找到了两种解决缺乏新(参数)'在泛型,但我想知道是否有更好的解决方案。
我需要在地球中使用Dna作为参数在ctor中创建任何Fruit的方法。我有很多水果。
使用Activator(或任何类似的形式)的缺点是,如果派生类没有相关或抽象,则会中断。
public class Earth
{
public Earth()
{
var dna = new Dna();
var orange = GetFruit<Orange>(dna);
}
private static T GetFruit<T>(Dna dna) where T : Fruit
{
return (T)Activator.CreateInstance(typeof(T), dna);
}
}
public abstract class Fruit
{
public Fruit(Dna dna)
{
}
}
public class Orange : Fruit
{
public Orange(Dna dna)
: base(dna)
{
}
}
public class Dna
{
}
使用无参数ctor的缺点是强制Dna变为可选。对于&#39;初始化(Dna dna)&#39;方法
public class Earth
{
public Earth()
{
var dna = new Dna();
var orange = GetFruit<Orange>(dna);
}
private static T GetFruit<T>(Dna dna) where T : Fruit, new()
{
return new T() { Dna = dna };
}
}
public abstract class Fruit
{
public Dna Dna { get; set; }
}
public class Orange : Fruit
{
}
public class Dna
{
}
答案 0 :(得分:4)
一个选项是添加另一个参数:Func<Dna, T>
:
private static T GetFruit<T>(Dna dna, Func<Dna, T> ctor) where T : Fruit
{
// I assume your real code does more here?
return ctor(dna);
}
然后你可以使用:
var orange = GetFruit(dna, x => new Orange(x));
请注意,这也意味着您不需要明确指定类型参数。缺点是,如果您要从另一个泛型方法调用此方法,则需要在整个堆栈中传递构造委托:(