![](/img/trans.png)
[英]Get Property Info from an object without giving the property name as string
[英]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.