[英]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.