2016-11-03 2 views
1

Я пытаюсь создать динамический лямбда ехр фильтровать некоторые результаты в моем списке, но я не могу понять, как создать динамическую FUNC <,>Динамическое создание Func <T,TR> C#

//Here I get the type of my object "Produto", but I can have other objects here...Like "Pedido" or another one. 
Type type = typeof(Produto); 

var param = Expression.Parameter(type, "arg"); 
var propName = Expression.Property(param, "Codigo"); 
var constP = Expression.Constant("123"); 

var nameStartsWith = Expression.Call(
    propName, 
    typeof(string).GetMethod("StartsWith", new[] { typeof(string) }), 
    constP); 

//Here I have to instantiate my Func<T, bool> 
//I can't instantiate it with my variable "type" to use on my Where clausule. 
//I don't know how to do this in another way, to create my lambda. 

var WhereExp = Expression.Lambda<Func<type, bool>>(nameStartsWith, param); 

return _uow.produto.GetAll().AsQueryable().Where(WhereExp).ToList(); 
+0

Вы можете создать ** ** интерфейс для этого неизвестного типа? –

+0

Что вы подразумеваете под «динамическим» Func точно? – Abion47

+0

Если вы можете создать функцию на '_uow' с общим типом, это будет работать лучше, я думаю. –

ответ

2

Вам нужно создать общий метод. Что-то вроде этого (непроверенные):

public Expression<Func<T, bool>> DynamicWhere<T>(string pname, string value) where T : class 
{ 
    var param = Expression.Parameter(typeof(T), "arg"); 
    var propName = Expression.Property(param, pname); 
    var constP = Expression.Constant(value); 

    var nameStartsWith = Expression.Call(
     propName, 
     typeof(string).GetMethod("StartsWith", new[] { typeof(string) }), 
     constP); 

    return Expression.Lambda<Func<T, bool>>(nameStartsWith, param); 
} 

Затем вы можете использовать его как это:

var WhereExp = DynamicWhere<Produto>("Codigo", "123"); 

return _uow.produto.GetAll().AsQueryable().Where(WhereExp).ToList(); 
+0

Спасибо! Вы просто прояснили мой разум! –