2012-06-01 115 views
0

代碼:Linq查詢 - 使用字符串作爲屬性?

foreach (PropertyInfo prop in typeof(SomeObject).GetProperties()) 
       { 
        if (Attribute.IsDefined(prop, typeof(SomeCustomAttribute))) 
        { 
         column.Expression(p => p.Name); 
        } 
       } 

我要添加具有SomeCustomAttribute數據註解指定列。

如何使用prop.Name(屬性的名稱)作爲屬性而不是手動p.Name?

例如..

... 
column.Expression(p => prop.Name); 
... 

column.Expression是

ITableColumn Expression<TProperty>(Expression<Func<TModel, TProperty>> expression) 
+0

你想獲得物業的價值?所以如果prop.Name ==「Foo」,你想要p.Foo? – Botz3000

+0

是的,確切地說。怎麼做? – Xatep

+1

動態LINQ! http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx –

回答

2

假設你此類型定義:

interface ITableColumn { } 
class SomeObject 
{ 
    public int MyProperty { get; set; } 
} 
class Column<TModel> 
{ 
    public ITableColumn Expression<TProperty>(Expression<Func<TModel, TProperty>> expression) 
    { 
     // just a stub 
     return null; 
    } 
} 

要單個屬性調用Column.Expression,通過反射而獲得,您必須先建立成員表達式:

private static LambdaExpression MakeMemberExpression(PropertyInfo propertyInfo) 
    { 
     var instanceExpression = Expression.Parameter(propertyInfo.DeclaringType); 
     return Expression.Lambda(Expression.MakeMemberAccess(instanceExpression, propertyInfo), instanceExpression); 
    } 

只要你不知道TProperty靜態,你不需要建強類型lambda(Expression<Func<TModel, TProperty>>)。 現在,讓我們來調用它:

 var property = typeof(SomeObject) 
      .GetProperty("MyProperty"); 

     var columnType = typeof(Column<>) 
      .MakeGenericType(typeof(SomeObject)); 

     var expressionMethod = columnType 
      .GetMethod("Expression") 
      .MakeGenericMethod(property.PropertyType); 

     var expr = MakeMemberExpression(property); 

     expressionMethod.Invoke(new Column<SomeObject>(), new[] { expr }); 

希望這有助於。

+0

非常感謝!我一直試圖讓這一天工作。謝謝! :) – Xatep