2017-07-29 88 views
1

我想傳遞一個屬性給一個函數,使函數知道屬性的值和屬性的名稱。這樣我就可以返回與屬性名稱匹配的錯誤。C#從參數傳遞/檢索屬性名稱而不反射

目前,我有這樣的代碼:

var userNameField = personField.GetChildField(f => f.UserName, nameof(personField.Value.UserName)); 

多次重複,所以第二個參數是第一個參數的拉姆達內部屬性的名稱。

是否有可能此參數,以便自動化:

  1. 重複的代碼消失了
  2. 屬性的字符串名稱是在編譯時計算的,不是每一個電話
運行時間

我非常希望我的代碼只是看起來像:

var userNameField = personField.GetChildField(f => f.UserName); 

我有使用反射使用Expression<Func...((MemberExpression) getPropertyFunc.Body).Member.Name;得到了這個工作,但是這太慢了,特別是將表達式編譯成函數,我可以使用它來獲取屬性值。

同樣,我已經通過這裏的想法閱讀:Get name of property as a string

是否有從在編譯時GetChildField功能填充屬性名稱的方法嗎?或者以某種方式將其編碼到模型中?

+0

如果編譯表達式是太慢了,你試圖緩存在編譯的結果呢?它不會讓第一個呼叫更快,但隨後的呼叫可能會受益。另外,由於您似乎只接受'x => x.Property'形式的表達式,您是否嘗試通過反射而不是編譯表達式來獲取屬性? –

+0

是否可以緩存編譯結果?我調用了在整個代碼庫中用許多不同表達式編譯表達式的方法,因此需要在每個調用的基礎上進行緩存。你的第二點是正確的,但。我設法通過消除編譯並通過反射獲取屬性來提高性能,但是它仍然不是理想的,因爲屬性名仍然是在運行時計算的(我相信..除非編譯器做了一些有趣的事情)。 –

回答

-1

按照羅斯林文檔發現herenameof操作者是在編譯時每第一行中的「語義」單元,讀取

的nameof表達是一個常數下評價。在所有情況下,nameof(...)都會在編譯時進行評估以生成一個字符串。它的參數在運行時不被評估,並被認爲是無法訪問的代碼(但它不會發出「無法訪問的代碼」警告)。

0

有可能通過以下幾點:

Item model=new Item();  
var propertyInfo = model.GetType();  
var value=propertyInfo.GetProperty("IrrA").GetValue(model, null).ToString(); 
+0

OP沒有要求沒有反射解決方案嗎? – kuskmen

+0

@kuskmen其實不,OP沒有要求沒有反思的解決方案。 OP僅聲稱編譯表達式太慢。這可能比編譯表達式更快(否則 - 我沒有測試)。 –

+0

我問了一個解決方案,它在編譯時計算屬性名稱,而不是運行時間。但是,該解決方案比編譯表達式更快。 –