【问题标题】:Call generic method which T is a Type调用 T 是类型的泛型方法
【发布时间】:2015-03-16 13:57:17
【问题描述】:

有一个通用方法可以从实体中选择一个字段,如下所示

public object GetOrderDynamically<T>(Expression selectPredicate, Expression predicate, Type type)
    {
        var order = orderFacade.FetchMulti((Expression<Func<Order, bool>>) predicate).AsQueryable();
        return order.Select((Expression<Func<Order, T>>)selectPredicate).FirstOrDefault();

    }

调用该方法的搜索结果为this

问题:我想澄清所选字段的类型。但是这个方法位于业务层,我可以将它与它的接口一起使用。实际上,业务层类将通过 IoC 注入到我的类中。

不知何故,我想用反射调用我的方法,这些方法通过注入实例化并能够将 T 设置为类型

任何帮助。谢谢

【问题讨论】:

  • 不清楚你想获得什么...试着写下你如何调用方法以及你想如何调用方法。
  • 您是在问如何通过反射调用泛型方法?目前对我来说有点不清楚......
  • 我想这样称呼它 var tt = typeof(Datetime); orderBiz.GetOrderDynamically(selectExp, predicateExp);
  • 混合泛型和反射并不是一个好主意。如果该方法采用Type,它不应该也有一个&lt;T&gt;,这意味着同样的事情——并且通过反射调用它不会利用&lt;T&gt;。您还不如直接返回 object 并完全忘记 &lt;T&gt;

标签: c# generics reflection


【解决方案1】:

您想使用 MethodInfo 上可用的 MakeGenericMethod 方法,例如

    someTarget.GetType()
        .GetMethod("SomeGenericMethod")
        .MakeGenericMethod(typeof(SomeGenericArgument)
        .Invoke(someTarget, someParameters);

另见:

Calling generic method with a type argument known only at execution time

编辑 - 给定示例

orderBiz.GetOrderDynamically(selectExp, predicateExp); – unos baghaii 5 分钟前

    orderBiz.GetType().GetMethod("GetOrderDynamically").MakeGenericMethod(tt).Invoke(orderBiz, new object [] { selectExp, predicateExp });

【讨论】:

  • 但是我想调用我不知道如何调用的实例的方法。
  • someTarget 是您的实例。
猜你喜欢
  • 1970-01-01
  • 2011-04-27
  • 1970-01-01
  • 1970-01-01
  • 2021-06-28
  • 2012-04-21
  • 1970-01-01
  • 1970-01-01
  • 2012-01-11
相关资源
最近更新 更多