Lyn*_*nxy 6 .net c# reflection visual-studio
我在这里达到了我的技能极限.我甚至不知道这是否可行 - 但我希望是这样.
我正在制作一个命令处理程序(文本).对于每个,Add()您可以指定所需参数的数量及其类型.例如:
void Add(string commandName, int requiredParameters, params Type[] paramTypes) { }
Add("test", 2, typeof(string), typeof(int));
Run Code Online (Sandbox Code Playgroud)
所以一个示例命令是:/test hello 7.命令处理程序检查以确保类型是正确的,例如,如果第二个参数不能转换为int,它将失败.
现在我遇到的问题是我想传递一个方法Add().(如果所有检查都通过,命令处理程序将调用此方法,并使用所需参数调用它).因此,所讨论的方法可以根据传入的内容包含任意数量的参数Add().
我该如何实现这一目标?代表不起作用抱怨参数不匹配.我尝试过这样的事情:
void Add<T1, T2>(..., Action<T1, T2> method) { }
Add(..., new Action<string, int>(cmd_MyMethod));
Run Code Online (Sandbox Code Playgroud)
但我必须为很多类型创建一个Add()方法.例如Add<T1, T2, T3, T4, etc>,它也使得输入调用变得很麻烦Add().
我不希望作为一个字符串传递给调用的方法,然后用this.GetType().GetMethod()得到它的句柄.虽然这种方式是理想的,但是当我进行模糊处理时它会变得混乱.
有谁知道有任何方法可以做到这一点?提前致谢.
尝试这个:
void Add(string commandName, int requiredParameters, Delegate method) { }
Run Code Online (Sandbox Code Playgroud)
您可以method.DynamicInvoke(...)调用委托引用的方法。请注意,这将使用反射,因此速度不会很快。但它非常灵活。
请注意,您仍然需要使用特定类型构造委托,因此您最终可能会像这样调用它:
Add("test", 2, new Action<string, int>(cmd_MyMethod));
Run Code Online (Sandbox Code Playgroud)
请注意,我省略了该Type[]参数,因为您实际上可以从MethodInfo委托引用中提取它!
( method.Method.GetParameters().Select(p => p.ParameterType).ToArray())