繁体   English   中英

使用lambda表达式作为泛型类型的参数的构造方法

[英]Constructor with lambda expression as parameter of generic type

我想从不同的BindingSources创建一些Material类的对象。

如何编写lambda表达式,以便不必在构造函数中指定类型?

例:

namespace test1
{
    class Program
    {
        static void Main(string[] args)
        {
            // Wood class defined in other assembly 
            List<Wood> woodList = new List<Wood>();
            woodList.Add(new Wood("Oak", 750));
            woodList.Add(new Wood("Spruce", 450));

        BindingSource bs = new BindingSource();
        bs.DataSource = woodList;

        //don't want to specify type in code
        Material<Wood> z2 = new Material<Wood>(1, bs, (i) => (Wood)(bs.Current));

            // Can I create object this way with lambda expression ?
            //Material<t> z1 = new Material<t>(1, bs, (lambda expression ??));
    }
}


public class Material<T> where T : class
{
    public int ID { get; set; }
    private T _item;
    public Material(
        int _id,
        BindingSource _bindSource,
        Func<object, T> _getTypeParameter)
    {
        this.ID = _id;
        T _item = _getTypeParameter(_bindSource.Current);
    }
}
}

我可以使用lambda表达式以这种方式创建对象吗?

简单:不,您在调用构造函数时必须提供泛型参数。 但是,您可以将构造函数调用包装到通用的工厂方法中:

Material<T> CreateMaterial<T>(int _id, BindingSource _bindSource, Func<object, T> _getTypeParameter)
{
    return new Material<T>(_id, _bindingSource, _getTypeParamer);
}

现在,编译器能够根据传递的参数自动推断类型:

 Material<Wood> z2 = CreateMaterial(1, bs, (i) => (Wood)(bs.Current));

暂无
暂无

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

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