是否有可能在不创建对象实例的情况下获取对象属性名称字符串

本文关键字:取对象 获取 属性 字符串 情况下 有可能 创建对象 实例 是否 | 更新日期: 2023-09-27 18:14:46

对象实例属性的字符串表示可以用Expression<Func<T>>:

string propertyName = ((MemberExpression) property.Body).Member.Name;

但是如果我没有(不想创建)实例怎么办?在这种情况下,我如何获得属性名称?

我需要一个字符串来表示某个对象的属性名。

假设有一个实体

public class Customer
{
    public int ID;
    public string Name;
}

现在我想把这个实体的键表达式传递给其他函数,因此我需要字符串"ID",但我不想像SomeOtherFunction("ID")那样硬编码字符串,而是使用表达式SomeOtherFunction(ExpressionReader.GetString(() => CustomerInstance.ID))。我需要提供实体实例。

现在我想做同样的而不需要创建实例

是否有可能在不创建对象实例的情况下获取对象属性名称字符串

可以使用如下方法签名:

private static string GetPropertyName<TModel, TProperty>(Expression<Func<TModel, TProperty>> property)
{
    MemberExpression memberExpression = (MemberExpression)property.Body;
    return memberExpression.Member.Name;
}

你可以在没有客户类实例的情况下调用这个方法:

string propertyName = GetPropertyName((Customer c) => c.ID);

当然,在转换到MemberExpression和访问memberExpression.Member.Name之前,您应该添加一些正确的表达式类型检查。

不,您不需要实例来分解Expression。即使表达式需要一个,您也永远不会调用它。

实际上,就像在第一个代码片段中做的那样。

你可以把你的代码改成这样:

SomeOtherFunction(ExpressionReader<Customer>.GetString(c => c.ID))

你明白了吗?

另外:

Customer c = null; // null intentionally
SomeOtherFunction(ExpressionReader.GetString(() => c.ID));

仍然没有问题,因为您没有调用表达式

对于c# 6中操作符的新名称,我建议如下:

 private string GetNameMyProperty1(TestC c = null)
 {
     return nameof(c.MyProperty1);
 }

我不确定我完全理解你的意思,但根据我的理解,你可以使用反射。使用这种方法,如果您有希望从中获得属性名的Type,那么您可以使用以下命令检索属性:

Type someType = typeof(SomeClass);
// Get all properties for a type
PropertyInfo[] properties = someType.GetProperties();
// Get a property from a type by it's name
PropertyInfo property = someType.GetProperty("PropertyName");

一旦您有了PropertyInfo类的实例,您就可以检索诸如属性名称之类的信息。

有关此方法的更多信息,请参阅MSDN文档。

选择的答案是好的,但不包括UnaryExpressions。当试图获取DateTime的属性时,它将失败:

    private static string GetPropertyName<TModel, TProperty>(Expression<Func<TModel, TProperty>> property)
    {
        if (property.Body is MemberExpression)
        {
            return ((MemberExpression)property.Body).Member.Name;
        }
        else
        {
            var op = ((UnaryExpression)property.Body).Operand;
            return ((MemberExpression)op).Member.Name;
        }  
    }