繁体   English   中英

解决C#中泛型缺少“ new(parameters)”的问题

[英]Workaround the lack of 'new(parameters)' in generic in C#

我找到了两种方法来解决泛型中缺少'new(parameters)'的问题,但是我想知道对于这种情况是否有更好的解决方案。

我需要在Earth中使用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变为可选。 “ Initialize(Dna dna)”方法也是如此。

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
{

}

一种选择是添加另一个参数: 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));

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM