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

时间:2016-01-30 23:10:34

标签: c# reflection

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

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

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

如果入口方法是:入口(IClass1 c1,IClass2 c2),它会选择此方法。虽然,如果它的入口(IClass2 c2,IClass1 c1),它将不会和mi将为null。

有解决方法吗?也许告诉GetMethod忽略参数顺序的方法?

感谢任何帮助,谢谢。

2 个答案:

答案 0 :(得分:4)

实现忽略参数顺序的方法是不明智的。参数顺序 critical 以确定您找到了正确的方法。

考虑这个简单的类:

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");
    }
}

答案 1 :(得分:0)

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

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

如果您无法确保这一点,您可以通过创建方法的重载或通过执行某些检查作为入口方法中的第一件事来解决问题。