我已达到技能限制。我甚至不知道这是否可行 - 但我希望是这样。
我正在制作一个命令处理程序(文本)。对于每个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()
来获取它的句柄。虽然这种方式是理想的,但是当我进行模糊处理时它会变得混乱。
有谁知道有任何方法可以做到这一点? 提前谢谢。
答案 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
来实际调用该方法。