使用linq我可以像这样创建一个查询
XElement.Elements("...").Select(x=> useX(x));
现在因为x只创建一个包装器Action而useX的参数是XElement,你可以像这样使用它:
XElement.Elements("...").Select(useX);
但是当我的类型具有匹配类型的构造函数,即MyClass(XElement元素)时,我必须使用:
XElement.Elements("...").Select(x=> new MyClass(x));
我的问题:有没有办法以类似上面的方式缩短对象的构造但是使用构造函数?我想象过这样的事情:
XElement.Elements("...").Select(MyClass);
答案 0 :(得分:7)
有没有办法以上面的方式缩短对象的构造,但是使用构造函数
简短回答:不,没有。
更长"回答" (实际上并不是一个答案,如果你想要的话更多的解决方法):
您可以向MyClass
添加静态构造方法:
public class MyClass
{
public MyClass(XElement elem)
{
// your constructor logic
}
public static MyClass Create(XElement elem)
{
return new MyClass(elem);
}
}
并使用
XElement.Elements("...").Select(MyClass.Create);
但它是否值得,取决于你! (个人观点:它不值得,只需坚持new MyClass(x)
)
答案 1 :(得分:3)
不,你不能缩短对lambda表达式中构造函数的调用。问题是从具有新new
运算符的操作调用构造函数。
你被.Select(x=> new MyClass(x))
困住了。当然,您可以改为调用工厂方法,但这更像是一种解决方法。
答案 2 :(得分:0)
实际上,接受 method-group 的语法是有效的,如果要使用的实际委托可以从使用中清楚地推断出来。例如。返回int并期望一个没有进一步重载的方法也可以像这样使用:
Select(myMethod);
然而,如果存在重载,则无法执行此操作,因为您不清楚其中的哪一个。
对于构造函数,它有点不同。无法使用 method-group 引用它。 MyClass
不是new MyClass()
的有效方法组。
简而言之:you can´t reference a constructor using a method-group。