2014-12-22 38 views
0

我有存儲函數的字典。 雖然存儲Func(testDir.Add(1,p => p.Id))很好。當我從字典中獲得Func時,我想要存儲在Func中的屬性(Id)的名稱。 我曾試過Retrieving Property name from lambda expression Get property name and type using lambda expression此鏈接。它在簡單的Func中工作。但與字典我得到成員= null在GetMemberInfo。想要Func參數名稱不是值,存儲在字典

public static MemberInfo GetMemberInfo<T, U>(Expression<Func<T, U>> expression) 
    { 
     var member = expression.Body as MemberExpression; 
     if (member != null) 
      return member.Member; 

     throw new ArgumentException("Expression is not a member access", "expression"); 
    } 


static void Main(string[] args) 
     { 
      Dictionary<int, Func<Soure.Employee, int>> testDir = new Dictionary<int, Func<Soure.Employee, int>>(); 
      testDir.Add(1, p => p.Id); 
      var testDirValue = testDir[1]; 
      Expression<Func<Soure.Employee, int>> expr1 = mc => testDirValue(mc); 
      MemberInfo member = Program.GetMemberInfo(expr1); 
      Console.WriteLine(member.Name); 
     } 

回答

0

expr1有表達不實際持有的表達式樹p => p.Id。它擁有lambda 的表達式樹,該表達式由對不透明委託的調用組成。沒有辦法從第二個lambda獲得關於哪個屬性被訪問的信息。

你想要的信息被編碼爲lambda文字語法。一旦以任意代理方式存儲和檢索,此信息不再可用。你真正想要做的是存儲在Expression<Func<Soure.Employee, int>>你的字典,這樣一個表達式樹是從您添加到您的字典中的拉姆達建:

var testDir = new Dictionary<int, Expression<Func<Soure.Employee, int>>>(); 
testDir.Add(1, p => p.Id); 
MemberInfo member = GetMemberInfo(testDir[1]); 
Console.WriteLine(member.Name); // Id 
+0

感謝阿薩德。然後如何執行存儲在Expression中的Func。 –

+0

@HemantMalpote爲了從'Expression'中獲得'Func',只需使用'Compile'方法。 'Func idGetter = testDir [1] .Compile(); int id = idGetter(someEmployee);'。 –

相關問題