解决C#中泛型中缺少“新(参数)”的问题

时间:2014-12-24 10:38:58

标签: c# generics

我找到了两种解决缺乏新(参数)'在泛型,但我想知道是否有更好的解决方案。

我需要在地球中使用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
{

}

1 个答案:

答案 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));

请注意,这也意味着您不需要明确指定类型参数。缺点是,如果您要从另一个泛型方法调用此方法,则需要在整个堆栈中传递构造委托:(