![](/img/trans.png)
[英]Invoke Enumerable.Where (or other overloaded generic method) using reflection
[英]Invoke generics overloaded method using reflection
我需要使用反射调用重载方法。 我的课程如下:
public static Transformer
{
//Overloaded method with generics parameter. First Transform Method
public static TranformerResult Transform<T>(object [] entities,
List<T> dataContract) where T:class
{
return transformerResult;
}
//Overloaded method without generics parameter. Second Transform Method
public static TranformerResult Transform(object entities,
Type dataContract)
{
return transformerResult;
}
}
public class TransformerResult
{
public List<T> GetTypes<T>() where T:class
{
}
}
我尝试使用以下语法调用第一个 Transform 方法:
GetMethod(“Transform”,(BindingFlags.Static | BindingFlags.Public),
null, new Type[](){typeof(object[]),typeof(List<Type>}, null)
但我得到了第二种变换方法。
我的意图是在transformerResult 上调用GetType。 TransformerResult 是一个 object,它返回第一个转换方法的调用。
任何人都可以帮助我编写 C# 代码来实现我的意图吗?
谢谢, 马希尔
您遇到问题的原因是您正在寻找的特定方法是通用的。 该方法的一种类型是基于该方法的通用参数。 这为您提供了一些注意事项 22。泛型参数与方法相关联,因此在您拥有方法本身之前,您无法正确构造该方法的类型数组。
这种特定场景的一个解决方案是只获取第一个通用方法。
var method = typeof(Transformer).GetMethods().Where(x => x.IsGenericMethod).First();
除非这行得通: typeof(List<>)
你需要对你所做的事情有点棘手,类似于我对这篇文章所做的事情: http://www.aaron-powell.com/posts /2010-04-08-reflection-and-generics.html
本质上是使用 LINQ 来搜索所有Transform
方法的集合,你不能只取回你本机想要的那个。
我认为调用GetMethod()
的类型数组中的第二种类型令人困惑。 如果您获得包含这些方法的 class 的 class Type
的实例,则不包括用于创建该 class 实例的实际通用参数(它看起来是基于您的第二个示例的Type
)。 相反,它只知道它有一个通用参数。
我目前没有编译器,所以很遗憾我无法尝试这个,但我会尝试为第二个参数指定typeof(List<T>)
的等效项(你可能会得到这是通过调用System.Collections.Generic.List.GetType()
来实现的,但我不肯定)。
如果这不起作用,我能想到的唯一其他选择是调用Type.GetMethods(BindingFlags.Static | BindingFlags.Public)
,然后自己搜索数组。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.