【问题标题】:Constructor with lambda expression as parameter of generic type将 lambda 表达式作为泛型类型参数的构造函数
【发布时间】:2017-09-29 13:17:57
【问题描述】:

我想从不同的 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);
    }
}
}

【问题讨论】:

    标签: c# generics lambda expression


    【解决方案1】:

    我可以用 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));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-05
      • 1970-01-01
      相关资源
      最近更新 更多