C# 类型 GetMethod(),其中参数顺序是随机的

本文关键字:顺序 参数 随机 GetMethod 类型 | 更新日期: 2023-09-27 18:32:44

我正在尝试获取对象的方法,如果该方法的参数与我提供的参数列表的顺序匹配,则可以正常工作。我试图避免这种情况,所以我不必担心不同文件中方法中参数类型的顺序。这是我所拥有的

MethodInfo mi = stateType.GetMethod("Entrance", typesToUse.ToArray());

在我的测试用例中,typesToUse 只包含两个唯一接口的实例,IClass1 和 IClass2 按此顺序排列。

如果 Entry 方法是 : Entrance(IClass1 c1, IClass2 c2),它会选取此方法。虽然,如果它的入口(IClass2 c2,IClass1 c1),它不会,然后mi将为空。

有没有办法解决这个问题?也许有一种告诉 GetMethod 忽略参数顺序的方法?

任何帮助,非常感谢,谢谢。

C# 类型 GetMethod(),其中参数顺序是随机的

实现忽略参数顺序的方法并不明智。参数顺序对于确定是否找到了正确的方法至关重要。

考虑这个简单的类:

public class A 
{
    public void Foo(int a, string b)
    {
        PrintAString();
    }
    public void Foo(string b, int a)
    {
        FormatHardDrive();
    }

}

如果你的方法忽略了参数顺序...坏事可能会发生!

说了这么多,当然是可能的。只需获取具有给定名称的所有方法,消除所有不包含typesToUse中所有类型参数的方法,然后确保只有一个。

以下代码对此进行了演示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
public class Program
{
    public static void Main()
    {
        var typesToUse = new Type[] { typeof(int), typeof(string) };
        var methods = typeof(A).GetMethods().Where(m => m.Name == "Foo");
        var matchingMethods = methods.Where(m => ContainsAllParameters(m, typesToUse));
        Console.WriteLine(matchingMethods.Single());
    }
    private static bool ContainsAllParameters(MethodInfo method, Type[] typesToUse) 
    {
        var methodTypes = method.GetParameters().Select(p => p.ParameterType).ToList();
        foreach(var typeToUse in typesToUse)
        {
            if (methodTypes.Contains(typeToUse))
            {
                methodTypes.Remove(typeToUse);
            }
            else 
            {
                return false;       
            }
        }
        return !methodTypes.Any();
    }
}
public class A
{
    public void Foo(string a, int b) 
    {
        Console.WriteLine("Hello World");
    }
}

您可以创建方法的重载,以不同的顺序获取参数。

推荐的解决方案可能只是确保它们始终以正确的顺序传递。

如果无法确保这一点,则可以通过创建方法重载或通过在 Entrance-方法中执行一些检查来解决问题。