【问题标题】:Passing lambda expressions as parameters using reflection使用反射将 lambda 表达式作为参数传递
【发布时间】:2013-01-24 21:32:39
【问题描述】:

我有一个通用的存储库方法调用如下

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(??)

}

【问题讨论】:

标签: c# linq reflection linq-expressions


【解决方案1】:

尝试传递Func&lt;TR, bool&gt;

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

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

假设您在 Get 方法中使用 LINQ 方法,您可以像这样填写函数

public IEnumerable<TR> Get<TR>(Func<TR, bool> func)
{
    return
        db.MyDbClassEntities.Where(func);
}

【讨论】:

  • 我只会在运行时知道我的存储库类型。为更清楚起见,对问题进行了编辑。
  • 我真的可以在编译器不知道 TR 是什么的情况下形成这样的表达式吗? MyProperty1 和 TR 是什么关系?
  • 如果编译没有关于 TR 类型的任何信息,您将无法归档您想要的内容。可能的类型没有实现任何接口吗?
  • 我不能使用 TR 构建表达式树,因为我知道表达式中使用的 TR 中的属性吗?
  • 您可以这样做,但是如果将意外的类型传递给函数会非常危险。你知道所有可以传递给函数的类型吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-03
  • 2012-12-27
  • 1970-01-01
  • 1970-01-01
  • 2017-12-14
相关资源
最近更新 更多