反思:如何获得泛型方法?

发布于 2024-10-20 21:55:49 字数 663 浏览 2 评论 0原文

可能的重复:
如何使用反射调用泛型方法?
通过反射选择正确的泛型方法

嗨,

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

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

通过反射,我可以得到第一个方法,如下所示:

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

但如何才能得到第二个通用方法?

Possible Duplicates:
How to use reflection to call generic Method?
Select Right Generic Method with Reflection

Hi there

Let's say I have two following two methods in a class:

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

With reflection, I could get the first Method like this:

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

But how can I get the second, generic method?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

有木有妳兜一样 2024-10-27 21:55:49
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 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();
很酷又爱笑 2024-10-27 21:55:49

我会这样做:

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”的方法,它是一种通用方法,具有没有约束的单个类型参数,以及一个与类型参数相同类型的“正常”参数。

显然,如果您不希望非常精确,您可以只做最少的工作来消除歧义,例如:

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

I would do it like this:

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

We're looking for a method called "MyMethod" that is a generic method with a single type-parameter having no constraints, and one 'normal' parameter of the same type as the type-parameter.

Obviously, if you're not looking to be very precise, you can just do the bare minimum to disambiguate, such as:

var myMethod = typeof(MyClass)
              .GetMethods()
              .Single(m => m.Name == "MyMethod" && m.IsGenericMethodDefinition);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文