2015-01-12 5 views
0

Я создал метод, который проверяет объект и возвращает [запрошенный] набор свойств.Отражающие динамические функции

public static List<object> Inspect<T>(T obj, params Func<T, object>[] funcs) 
{ 
    List<object> results = new List<object>(funcs.Length); 

    foreach (var func in funcs) 
    { 
     results.Add(func(obj)); 
    } 

    return results; 
} 

Затем вызывается, например, на List, например, так:

List<string> peopleData = new List<string>(10) { "name", "age", "address" }; 
List<object> properties = Inspect(peopleData, p => p.Count, p => p.Capacity); 

// The results would be 
// properties[0] = 3 
// properties[1] = 10 

Я хотел бы адаптировать метод Inspect вместо этого вернуть Dictionary<string, object>, где ключи словаря будет имена свойств. Затем адаптированный метод будет вызван следующим образом:

List<string> peopleData = new List<string>(10) { "name", "age", "address" }; 
Dictionary<string, object> properties = Inspect(peopleData, p => p.Count, p => p.Capacity); 

// The results would be 
// properties["Count"] = 3 
// properties["Capacity"] = 10 

Возможно ли это? Если да, и если решение основано на отражении (как я полагаю, это должно было бы быть), будет ли большой успех?

ответ

1

Вы должны были бы использовать классический «Допрос» подход к Func<..> - Retrieving Property name from lambda expression

public static IDictionary<string, object> Inspect<T>(T obj, 
    params Expression<Func<T, object>>[] funcs) 
{ 
    Dictionary<string, object> results = new Dictionary<string, object>(); 

    foreach (var func in funcs) 
    { 
     var propInfo = GetPropertyInfo(obj, func) 
     results[propInfo.Name] = func.Compile()(obj)); 
    } 

    return results; 
} 

Ps, а Servy отметил, вам также нужно сделать PARAMS использовать Expression.

+0

В OP нет объектов Expression. – Servy

+0

Thanls @ chris-eelmaa Я читал по вашей ссылке, есть ли причина, почему этот ответ не так хорош? [link] (http://stackoverflow.com/questions/671968/retrieving-property-name-from-lambda-expression/2916344#2916344) – psand2286

+0

@ psand2286: нет особых причин. Я выбрал ответ, потому что A) он был первым, B) у него была та же подпись, что и ваша функция 'Inspect' (вид). –

Смежные вопросы