gpt4 book ai didi

c# - 如何在涉及参数时测试是否存在有效方法

转载 作者:行者123 更新时间:2023-11-30 18:03:33 25 4
gpt4 key购买 nike

我有以下方法:

    public MethodInfo FancyGetMethodInfo
(object obj, string methodName, Type[] methodSignature)
{
return obj.GetType().GetMethod(methodName, methodSignature);
}

为了举例说明,我在我的对象中传递了这两种方法

    public int Subtract(int a, int b) { return a - b; }

public int Add(params int[] a) { return a.Sum(); }

当我执行以下几行时,我得到了这些结果:

        var SubMethod = FancyGetMethodInfo(obj, "Subtract", 
new Type[] { typeof(int), typeof(int) });
//I get a MethodInfo
var AddMethod = FancyGetMethodInfo(obj, "Add",
new Type[] { typeof(int), typeof(int) });
//I get a Null reference

我确定这是因为 Add 中的参数。给定一个包含整数的任意大小的 Type[] 并且只能访问我的 FancyGetMethodInfo 方法中提供的变量,是否有一种干净的方法可以为我的 Add 方法获取对我的 MethodInfo 的引用?

编辑:Jon Skeet 更有说服力地说,我想执行与 C# 编译器在我的方法中执行的相同的绑定(bind)。它需要与子类、隐式转换、任意长度参数等一起正常工作……

同样应要求,此处的相关链接是:Determining if a parameter uses "params" using reflection in C#?这将使我知道该方法有一个参数。

最佳答案

嗯,你可以:

  • 找到所有名称正确的方法
  • 对于每个方法:
    • 检查方法中的最后一个参数是否为“params”数组(根据 this question ;感谢 yas4891)
    • 检查给定的参数类型直到但不包括最后一个参数是否与方法中的参数类型匹配
    • 检查剩余参数类型是否都匹配最终参数的数组元素类型

请注意,一旦找到匹配项(并且没有找到不需要此参数扩展的匹配项),您就需要记住您可以稍后适本地处理参数(假设您想要实际调用该方法)。

老实说,这有点傻……在我看来,您有以下三种选择:

  • 将调用者更改为传入 typeof(int[]) 并且您现有的代码将起作用
  • 更改 FancyGetMethodInfo 以如上所述处理参数数组
  • 更改 Sum 以接受两个整数(或者可能有各种重载)

这取决于你选择哪条路线......

关于c# - 如何在涉及参数时测试是否存在有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7103320/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com