我有一个通用的存储库方法调用,如下所示
var result = Repository<MyDbClass>.Get(x => x.MyProperty1 == "Something"
&& (!x.MyProperty2.HasValue || x.MyProperty2 == "SomethingElse"));
我希望使用反射来调用此方法。我主要想找到一种方法,使用反射将lambda表达式作为参数传递。
修改
实际上我的存储库类型只能在运行时知道。所有这些存储库下的表都相似,有一些共同的列。在这些列上应用过滤器。所以我不能传递一个表达式。
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(??)
}
答案 0 :(得分:1)
尝试传递Func<TR, bool>
var method = typeof(TR).GetMethod("Get");
if (method != null)
{
method.Invoke(new Func<TR, bool>(
(x) => x.MyProperty1 == "Something" /* etc... */));
}
假设你在Get
方法中使用LINQ方法,你可以像这样填充func
public IEnumerable<TR> Get<TR>(Func<TR, bool> func)
{
return
db.MyDbClassEntities.Where(func);
}