因為當您搜索字段時(如在該問題中),您使用字符串表示"Id"
。一旦改變,你的反射就會崩潰。
達林建議的是靜態類型:
Expression<Func<Program, int>> expression = p => p.Id;
你看到了嗎?這很有趣,但C#4.0編譯器並不是眾所周知的特性:自動從lambda表達式構建表達式樹並將其轉換為Expression<T>
。那麼之後您可以遍歷它並獲取Id
MemberInfo
。但它不像Reflection那樣通用,因為你不能用string
搜索。
正如所述的問題是為什麼表達樹比反射更安全。
答案是他們都在使用反思。
編輯澄清 - MemberInfo.GetCustomAttributes是一個反射調用。
http://msdn.microsoft.com/en-us/library/system.reflection.memberinfo.getcustomattributes(VS.71).aspx