簡體   English   中英

是否可以在不創建對象實例的情況下獲取對象屬性名稱字符串?

[英]Is it possible to get an object property name string without creating the object instance?

可以使用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);
 }

選定的答案很好,但不包括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;
        }  
    }

我不確定我完全理解你的意思,但根據我的理解,你可以使用反射。 使用此方法,如果您具有要從中獲取屬性名稱的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文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM