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 忽略参数顺序的方法?
任何帮助,非常感谢,谢谢。
实现忽略参数顺序的方法并不明智。参数顺序对于确定是否找到了正确的方法至关重要。
考虑这个简单的类:
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-方法中执行一些检查来解决问题。