Передача лямбда-выражений в качестве параметров с использованием отражения

У меня есть общий вызов метода репозитория, который выглядит следующим образом

var result = Repository<MyDbClass>.Get(x => x.MyProperty1 == "Something"
&& (!x.MyProperty2.HasValue || x.MyProperty2 == "SomethingElse"));

Я надеюсь вызвать этот метод с помощью отражения. В основном я ищу способ передать лямбда-выражение в качестве параметра с использованием отражения.

ИЗМЕНИТЬ

На самом деле мой тип репозитория будет известен только во время выполнения. Таблицы во всех этих репозиториях похожи и имеют некоторые общие столбцы. Именно по этим столбцам применяется фильтр. Поэтому я не могу передать выражение как есть.

public void SomeMethod<T, TR>(T repository, TR dataObject)
{
    var type = repository.GetType();
    var dataType = dataObject.GetType();
    var getMethod = type.GetMethod("Get");
    //How to invoke the method by passing the lambda as parameter(??)

}

person Vijay Ganesh    schedule 24.01.2013    source источник
comment


Ответы (1)


Попробуйте передать Func<TR, bool>

var method = typeof(TR).GetMethod("Get");

if (method != null)
{
    method.Invoke(new Func<TR, bool>(
        (x) => x.MyProperty1 == "Something" /* etc... */));
}

Предполагая, что вы используете методы LINQ в своем методе Get, вы можете просто заполнить функцию следующим образом:

public IEnumerable<TR> Get<TR>(Func<TR, bool> func)
{
    return
        db.MyDbClassEntities.Where(func);
}
person Jan P.    schedule 24.01.2013
comment
Я узнаю свой тип репозитория только во время выполнения. Вопрос отредактирован для большей ясности. - person Vijay Ganesh; 24.01.2013
comment
Могу ли я действительно сформировать такое выражение, если компилятор не знает, что такое TR? Какая связь между MyProperty1 и TR? - person Vijay Ganesh; 24.01.2013
comment
Вы не можете заархивировать то, что хотите, если в компиляции нет информации о типе TR. Нет ли интерфейса, реализованного возможными типами? - person Jan P.; 24.01.2013
comment
не могу ли я построить дерево выражений, используя TR, поскольку я знаю свойства TR, используемые в выражении? - person Vijay Ganesh; 24.01.2013
comment
Вы могли бы сделать это, но было бы очень опасно, если бы в функцию был передан непредвиденный тип. Знаете ли вы все типы, которые могут быть переданы в функцию? - person Jan P.; 25.01.2013
comment
Да, как я уже сказал, я буду знать свойства ТУ, поскольку все возможные типы ТУ будут иметь схожую структуру. - person Vijay Ganesh; 25.01.2013
comment
Нет ли возможности прописать свойства, содержащиеся во всех типах, которые будут передаваться как TR в интерфейсе, и построить ограничение для TR в методе? например public void SomeMethod<T, TR>(T repository, TR dataObject) where TR : IMyInterface - person Jan P.; 25.01.2013