2016-02-14 41 views
0

我想做以下操作;如何動態生成C#中的Lambda表達式

public IEnumerable<SalesRegister> GetSalesRegister() 
    { 
     return _client.GetAllSalesRegisters().OrderBy(x => x.CompanyName); 
    } 

通過做類似的事情;

public IEnumerable<SalesRegister> GetSalesRegister(string sortBy) 
    { 
     return _client.GetAllSalesRegisters().OrderBy(x => sortBy); 
    } 

爲了這個,我曾嘗試以下,但沒有奏效

public IEnumerable<SalesRegister> GetSalesRegister(string sortBy) 
    { 
     var type = typeof(SalesRegister); 
     var param = Expression.Parameter(type, "x"); 
     var len = Expression.PropertyOrField(param, sortBy); 
     return _client.GetAllSalesRegisters().OrderBy(x => len); 
    } 

我不知道如果我能這樣做,有人可以幫我嗎?

回答

3

試試這個 -

public IEnumerable<SalesRegister> GetSalesRegister(Expression<Func<SalesRegister, object>> sortByExp) 
{ 
    return _client.GetAllSalesRegisters().OrderBy(sortByExp.Compile()); 
} 

你可以這樣調用 -

GetSalesRegister(x => x.CompanyName); 

要通過你需要有類型爲Expression<Func<T, TR>>,其中T是基類lambda表達式和TR是返回類型的表達式

或者,如果您只有字符串名稱,請嘗試構建像這樣的表達式 -

public IEnumerable<SalesRegister> GetSalesRegister(string sortBy) 
{ 
    var param = Expression.Parameter(typeof (SalesRegister), "x"); 
    var prop = typeof (SalesRegister).GetProperty(sortBy); 
    var objectFuncType = typeof (Func<,>).MakeGenericType(typeof (SalesRegister), prop.PropertyType); 
    var propExp = Expression.PropertyOrField(param, sortBy); 
    var exp = Expression.Lambda(objectFuncType, propExp, param); 
    var converted = Expression.Convert(exp.Body, typeof (object)); // only needed if you are passing in no referene types like int, double, etc as parameters, otherwise ignore this line and use 'exp' in place of 'converted' in the next line 
    var sortByExp= Expression.Lambda<Func<SalesRegister, object>>(converted, exp.Parameters); 

    return _client.GetAllSalesRegisters().OrderBy(sortByExp.Compile()); 
} 

你可以這樣調用 -

GetSalesRegister("CompanyName"); 
+0

什麼是這裏TDomain? – Learner

+0

這是一個錯字,這是來自我的一個實現的複製代碼。錯過了以實際類型取代。使用SalesRegister進行實施。 –

+0

現在我正在收到編譯時錯誤 - 方法'IOrderedEnumerable System.Linq.Enumerable.OrderBy ,Func )>'的類型參數不能從用法中推斷。嘗試明確指定類型參數。在GetSalesRegister方法的最後一行。 – Learner