2010-08-03 78 views
4

我正在使用以下代碼從匿名類型檢索命名成員。有什麼辦法可以將follwing代碼轉換爲使用lambda表達式來實現此目的,或者至少允許調用代碼使用lamda,即使'deep down'我必須使用字符串嗎?如何避免使用字符串成員名稱來獲取匿名類型的成員?

private T GetAnonymousTypeMember<T>(object anonymousType, string memberName) where T: class 
{ 
    var anonTypesType = anonymousType.GetType(); 
    var propInfo = anonTypesType.GetProperty(memberName); 
    return propInfo.GetValue(anonymousType, null) as T; 
} 

新增: 這是怎麼anonymousType到達。該GetAnonymousTypeMember方法是私有的一類,其唯一的公共方法聲明如下:

公共無效PublishNotification(NotificationTriggers觸發,對象templateParameters)

我調用這個方法:

PublishNotification(NotificationTriggers.RequestCreated, new {NewJobCard = model}); 

new {NewJobCard = model}是什麼是GetAnonymousTypeMember作爲anonymousType

+0

你想改用什麼?是否有另一種提到會員的方式? – 2010-08-03 09:30:28

+0

喜歡的東西GetAnonTypeMember(M => m.Person) – ProfK 2010-08-03 09:38:08

+0

爲什麼不能簡單地用'm.Person'?爲什麼需要在一個方法中做到這一點,當方法唯一要做的就是調用lambda表達式? – Guffa 2010-08-03 09:41:14

回答

1
public U GetMemberValue<T, U>(T instance, Expression<Func<T, U>> selector) 
{ 
    Type type = typeof(T); 
    var expr = selector.Body as MemberExpression; 
    string name = expr.Member.Name; 

    var prop = type.GetProperty(name); 
    return (U)prop.GetValue(instance, null); 
} 

將使得能夠做到:

string name = GetMemberValue(new { Name = "Hello" }, o => o.Name); 
0

沒有,當你發送的對象作爲類型object,有一個參數沒有特定類型的信息。如果你想訪問對象的成員,你需要使用反射從對象本身獲取類型信息。

使用lambda表達式來獲得會員會的工作,但是這將是毫無意義的...

0

你的意思是這樣的嗎?

private R GetAnonymousTypeMember<T, R>(T anonymousType, Expression<Func<T, R>> e) where T : class 
{ 
    return e.Compile()(anonymousType); 
} 

public void Do() 
{ 
    var x = new {S = "1", V = 2}; 
    var v = GetAnonymousTypeMember(x, _ => _.V); 
} 
+0

寫一個非常尷尬的方式'var v = x.V;'...... – Guffa 2010-08-03 09:43:01

1

但你爲什麼不只是使用動態?例如:

class MyClass 
{ 
    public int member = 123; 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
    MyClass obj = new MyClass(); 

    dynamic dynObj = obj; 
    Console.WriteLine(dynObj.member); 

    Console.ReadKey(); 
    } 
} 

你也可能涉及ExpandoObject

List<dynamic> objs = new List<dynamic>(); 

dynamic objA = new ExpandoObject(); 
objA.member = "marian"; 
objs.Add(objA); 

dynamic objB = new ExpandoObject(); 
objB.member = 123; 
objs.Add(objB); 

dynamic objC = new ExpandoObject(); 
objC.member = Guid.NewGuid(); 
objs.Add(objC); 

foreach (dynamic obj in objs) 
    Console.WriteLine(obj.member); 

Console.ReadKey(); 
相關問題