Csharp/C#教程:反思:如何获得通用方法?分享


反思:如何获得通用方法?

可能重复:
如何使用reflection来调用generics方法?
选择具有reflection的右通用方法

嗨,您好

假设我在一个类中有以下两种方法:

public void MyMethod(object val) {} public void MyMethod(T val) {} 

通过reflection,我可以得到第一个这样的方法:

 Type[] typeArray = new Type[1]; typeArray.SetValue(typeof(object), 1); var myMethod = myInstance.GetType().GetMethod("MyMethod", typeArray); 

但是我如何获得第二种通用​​方法呢?

 var myMethod = myInstance.GetType() .GetMethods() .Where(m => m.Name == "MyMethod") .Select(m => new { Method = m, Params = m.GetParameters(), Args = m.GetGenericArguments() }) .Where(x => x.Params.Length == 1 && x.Args.Length == 1 && x.Params[0].ParameterType == x.Args[0]) .Select(x => x.Method) .First(); 

我会这样做:

 var methods = from m in typeof(MyClass).GetMethods() where m.Name == "MyMethod" && m.IsGenericMethodDefinition let typeParams = m.GetGenericArguments() let normalParams = m.GetParameters() where typeParams.Length == 1 && normalParams.Length == 1 && typeParams.Single() == normalParams.Single().ParameterType && !typeParams.Single().GetGenericParameterConstraints().Any() select m; var myMethod = methods.Single(); 

我们正在寻找一种名为“MyMethod”的方法,它是一种通用方法,只有一个没有约束的类型参数,以及一个与type-parameter类型相同的“normal”参数。

显然,如果你不是非常精确,你可以做到最低限度消除歧义,例如:

上述就是C#学习教程:反思:如何获得通用方法?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

 var myMethod = typeof(MyClass) .GetMethods() .Single(m => m.Name == "MyMethod" && m.IsGenericMethodDefinition); 

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/958397.html

(0)
上一篇 2021年11月22日
下一篇 2021年11月22日

精彩推荐