我想傳遞一個屬性給一個函數,使函數知道屬性的值和屬性的名稱。這樣我就可以返回與屬性名稱匹配的錯誤。C#從參數傳遞/檢索屬性名稱而不反射
目前,我有這樣的代碼:
var userNameField = personField.GetChildField(f => f.UserName, nameof(personField.Value.UserName));
多次重複,所以第二個參數是第一個參數的拉姆達內部屬性的名稱。
是否有可能此參數,以便自動化:
- 重複的代碼消失了
- 屬性的字符串名稱是在編譯時計算的,不是每一個電話
我非常希望我的代碼只是看起來像:
var userNameField = personField.GetChildField(f => f.UserName);
我有使用反射使用Expression<Func...
即((MemberExpression) getPropertyFunc.Body).Member.Name;
得到了這個工作,但是這太慢了,特別是將表達式編譯成函數,我可以使用它來獲取屬性值。
同樣,我已經通過這裏的想法閱讀:Get name of property as a string
是否有從在編譯時GetChildField
功能填充屬性名稱的方法嗎?或者以某種方式將其編碼到模型中?
如果編譯表達式是太慢了,你試圖緩存在編譯的結果呢?它不會讓第一個呼叫更快,但隨後的呼叫可能會受益。另外,由於您似乎只接受'x => x.Property'形式的表達式,您是否嘗試通過反射而不是編譯表達式來獲取屬性? –
是否可以緩存編譯結果?我調用了在整個代碼庫中用許多不同表達式編譯表達式的方法,因此需要在每個調用的基礎上進行緩存。你的第二點是正確的,但。我設法通過消除編譯並通過反射獲取屬性來提高性能,但是它仍然不是理想的,因爲屬性名仍然是在運行時計算的(我相信..除非編譯器做了一些有趣的事情)。 –