我以前使用以下语法创建了将属性作为输入的方法:
public void MyMethod<T>(Expression<Func<T>> property) { }
public int MyProperty { get; set; }
public void SomeOtherMethod() {
MyMethod(() => MyProperty);
}
这样我就可以将属性转换为MemberExpression
并获取属性的完全限定名称。
但是,是否可以在类构造函数中执行相同操作,或者具有存储其他属性的属性,例如property
中MyMethod()
变量的作用?
我已尝试过以下内容,但由于在任何一种情况下都未指定type参数,因此无法正常工作,但我甚至不知道要使用哪种类型...特别是因为类型是神奇的在最顶层的例子中推断。
在构造函数
中public class MyClass<T> {
public MyClass(Expression<Func<T>> property) { }
}
public int MyProperty { get; set; }
var myClass = new MyClass(() => MyProperty);
作为财产
public class MyClass<T> {
public Expression<Func<T>> SomeProperty { get; set; }
}
public int MyProperty { get; set; }
var myClass = new MyClass() { SomeProperty = () => MyProperty };
那么,如何在不使用类型定义的情况下在自己的构造函数或属性中拥有属性表达式?
答案 0 :(得分:1)
是否可以在类构造函数中推断[泛型参数]?
在C#generic inference is not supported on constructors中,您必须明确设置它:
var myClass = new MyClass<int>(() => MyProperty);
不支持的主要原因是因为隐式类型转换通常会有许多类型可用作通用约束,因此编译器必须选择“最佳”通用参数基于它拥有的信息。与设计,编程,测试,记录和集成此逻辑相关的成本超过了收益,或者至少没有提供超出MS 可能花费时间开发的其他功能的相对收益。 / p>
在这种情况下,您知道最佳通用参数类型,因为MyProperty
属性返回int
。从技术上讲,您可以使用int
(object
,double
等隐式转换的任何类型,但int
最适合。
我可以使用对象作为一个全能的吗?
当然,但是你的代码不是通用的。你可以做到
public class MyClass {
public MyClass(Expression<Func<object>> property) { }
}
答案 1 :(得分:0)
您需要提供T
var myClass = new MyClass<int>(() => MyProperty);
var myClass = new MyClass<int>() { SomeProperty = () => MyProperty };
否则它不知道它应该在构造函数中获得什么类型的表达式。