c# - 为什么 C#.net 中的表达式主体不能使用 int、double 或 bool 类型的属性?

标签 c# .net properties types expression

我有一个函数:

private string GetPropertyName(Expression<Func<object, object>> f) {
    if ((f.Body as MemberExpression) != null) {
        return (f.Body as MemberExpression).Member.Name;
    }
    return "";
}

它是这样使用的:

string x1 = GetPropertyName(x => Property1);
string x2 = GetPropertyName(x => Property2);
string x3 = GetPropertyName(x => Property3);

其中 Property1 是一个 int,Property2 是一个字符串,Property3 是一个对象...

只有Property2和Property3分别是string和object类型的名字才正确返回,但是Property1的f.Body as MemberExpression是null...

为什么会这样,我们如何更改代码以使函数正确返回属性的名称?

最佳答案

我想问题是 x => Property1 表达式包含对对象的隐式转换。 编译器添加此类强制转换以实现 GetPropertyName 的参数。

你应该检查这个类型转换

private string GetPropertyName(Expression<Func<object, object>> f) {
    var body = f.Body;
    if (body.NodeType==ExpressionType.Convert)
      body = ((UnaryExpression) body).Operand;
    if ((body as MemberExpression) != null) {
        return (body as MemberExpression).Member.Name;
    }
    return "";
}

关于c# - 为什么 C#.net 中的表达式主体不能使用 int、double 或 bool 类型的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1875720/

相关文章:

.net - 在VS 2010 C#项目之间共享.cs文件

c# - ASP.NET MVC 动态 View

c# - Linq to Xml 转换列表

c# - 如何在没有 Visual Studio 的情况下使用自定义脚本添加/更新引用?

c# - 跟踪更改(未保存)的对象

c# - 属性的访问修饰符;为什么以下不起作用?

c# - 使用 TextWrapping 和 ScrollViewer 的大性能问题

c# - Visual Studio 中无法识别的数据库格式 accdb

C#相对于VB的优势

c# - 清洁代码 : Should Objects have public properties?