属性表达式在类构造函数中,或作为其自己的属性

本文关键字:属性 自己的 表达式 构造函数 | 更新日期: 2023-09-27 17:52:16

我之前已经创建了使用以下语法将属性作为输入的方法:

public void MyMethod<T>(Expression<Func<T>> property) { }
public int MyProperty { get; set; }
public void SomeOtherMethod() {
    MyMethod(() => MyProperty);
}

这样我就可以,例如,将属性转换为MemberExpression并获得属性的完全限定名称。

然而,是否可以在类构造函数中做同样的事情,或者有一个存储另一个属性的属性,就像property变量在MyMethod()中所做的那样?

我已经尝试了以下方法,但这不起作用,因为在两种情况下都没有指定类型参数,但我甚至不知道使用哪种类型…特别是因为在最上面的例子中神奇地推断了类型。

在构造函数

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 };

那么,我如何在构造函数或自己的属性中拥有属性表达式而无需使用类型定义呢?

属性表达式在类构造函数中,或作为其自己的属性

是否可以在类构造函数中[推断泛型参数]?

在c#中,构造函数不支持泛型推理,因此必须显式设置:

var myClass = new MyClass<int>(() => MyProperty);
不支持

的主要原因是,由于隐式类型转换,通常有许多类型可以用作泛型约束,因此编译器必须根据它所拥有的信息选择"最佳"泛型参数。与设计、编程、测试、编写文档和集成此逻辑相关的成本超过了收益,或者至少没有提供超过MS 可以花费时间开发的其他特性的相对收益。

在这种情况下,您知道最佳泛型参数类型,因为MyProperty属性返回int。从技术上讲,您可以使用从int (object, double等)隐式转换的任何类型,但int是最合适的。

我是否可以使用object作为包罗万象?

当然,但是你的代码不是通用的。你可以直接输入

public class MyClass {
    public MyClass(Expression<Func<object>> property) { }
}

您需要提供T的类型参数

var myClass = new MyClass<int>(() => MyProperty);
var myClass = new MyClass<int>() { SomeProperty = () => MyProperty };

否则它将不知道在构造函数中应该得到什么类型的表达式。