C#如何调用参数数量未知的方法

时间:2010-11-18 21:20:10

标签: c# .net visual-studio reflection

我已达到技能限制。我甚至不知道这是否可行 - 但我希望是这样。

我正在制作一个命令处理程序(文本)。对于每个Add(),您可以指定所需参数的数量及其类型。例如:

void Add(string commandName, int requiredParameters, params Type[] paramTypes) { }
Add("test", 2, typeof(string), typeof(int));

所以示例命令是:/test hello 7。命令处理程序检查以确保类型是正确的,例如,如果第二个参数不能转换为int,它将失败。

现在我遇到的问题是我想在Add()中传递一个方法。 (如果所有检查都通过,命令处理程序将调用此方法,并使用所需参数调用它)。因此,根据Add()中传递的内容,相关方法可以包含任意数量的参数。

我如何实现这一目标?代表不起作用抱怨参数不匹配。我尝试过这样的事情:

void Add<T1, T2>(..., Action<T1, T2> method) { }
Add(..., new Action<string, int>(cmd_MyMethod));

但我必须为很多类型创建一个Add()方法。例如Add<T1, T2, T3, T4, etc>,也可以输入Add()的调用。

想要传递方法以字符串形式调用,然后使用this.GetType().GetMethod()来获取它的句柄。虽然这种方式是理想的,但是当我进行模糊处理时它会变得混乱。

有谁知道有任何方法可以做到这一点? 提前谢谢。

3 个答案:

答案 0 :(得分:3)

试试这个:

void Add(string commandName, int requiredParameters, Delegate method) { }

您可以调用method.DynamicInvoke(...)来调用委托引用的方法。请注意,这将使用反射,因此它不会很快。但它很灵活。

请注意,您仍然需要使用特定类型构建委托,因此您最终可能会这样调用它:

Add("test", 2, new Action<string, int>(cmd_MyMethod));

请注意,我省略了Type[]参数,因为您实际上可以从委托引用的MethodInfo中提取此参数! (method.Method.GetParameters().Select(p => p.ParameterType).ToArray()

答案 1 :(得分:3)

Action<string, int, Type[]>与您的Add方法匹配。

示例:

public class ParamsTest
{
    public void CallMyMethod()
    {
        Action<string, int[]> myDelegate = new Action<string, int[]>(MyMethod);
        myDelegate("hello", new int[] { 1, 2, 3, 4 });
    }

    private void MyMethod(string arg1, params int[] theRest)
    {
        Console.WriteLine(arg1);
        foreach (int i in theRest)
        {
            Console.WriteLine(i);
        }
        Console.WriteLine("end");
    }
}

答案 2 :(得分:0)

您可以创建自己的自定义属性,您可以使用该属性进行标记,然后识别(现在混淆)方法,并使用反射根据属性查找它们。然后,您可以使用Invoke()中的MethodInfo来实际调用该方法。