[英]How do you invoke a method with any signature dynamically in C#?
我有一个带有一些常见错误处理代码的类,我想传入方法和参数以进行调用,但是我不太想出语法。 我想做的大致是这样的:
private void InvokeHelper(Delegate method, params object[] args)
{
bool retry = false;
do
{
try
{
method.DynamicInvoke(args);
retry = false;
}
catch (MyException ex)
{
retry = HandleException(ex);
}
} while (retry);
}
然后能够执行以下操作:
InvokeHelper(foo.MethodA, a, b, c);
InvokeHelper(foo.MethodB, x, y );
这将导致将foo.MethodA和foo.MethodB转换为System.Delegate的编译器错误。 我想出了以下解决方法(我实际上更喜欢它,因为这样我就可以对方法的参数进行类型检查了),但是我很好奇是否有一种方法可以做我本来想做的事情? 我知道我可以使用foo.GetType().GetMethod("MethodA")
并调用它,但是我试图避免反射。 我主要只是想了解如何在.net中动态调用方法。
解决方法:
private delegate void EmptyDelegate();
private void InvokeHelper(EmptyDelegate method)
{
bool retry = false;
do
{
try
{
method.Invoke();
retry = false;
}
catch (MyException ex)
{
retry = HandleException(ex);
}
} while (retry);
}
然后致电:
InvokeHelper(delegate() { foo.MethodA(a, b, c); });
InvokeHelper(delegate() { foo.MethodB(x, y); });
首先,您的签名是
private void InvokeHelper(Delegate method, params object[] args)
但是,您犯了一个错误,您必须将args分组到一个数组中才能调用此方法:
InvokeHelper(foo.MethodA, new object[] { a, b, c});
parms
关键字告诉编译器为您执行此操作; 您可以这样调用此方法:
InvokeHelper(foo.MethodA, a, b, c);
其次,如果您的目标是3.0或更高版本,请不要使用Delegate,而应使用Action:
private void InvokeHelper(Action method)
并这样称呼:
InvokeHelper(()=> MyMethodToInvoke(a, b, c));
这只是整体上更好的方法。
至于为什么会遇到编译器问题,这是因为System.Delegates讨厌我们。 这是一个简单的事实。 那是因为没有从方法组到委托的隐式转换。
这是根据Will的建议使用Action进行的重写:
private void InvokeHelper(Action method)
{
bool retry = false;
do
{
try
{
method();
retry = false;
}
catch (MyException ex)
{
retry = HandleException(ex);
}
} while (retry);
}
public void Test()
{
FooClass foo = new FooClass();
InvokeHelper( () => foo.MethodA(1, "b", 3) );
InvokeHelper( () => foo.MethodB(2, "y"));
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.