使用输出参数从 MethodInfo 创建委托,无需动态调用
Create Delegate from MethodInfo with Output Parameters, without Dynamic Invoke
我正在尝试从具有输出参数的 MethodInfo 对象获取委托。我的代码如下:
static void Main(string[] args) {
MethodInfo m = typeof(Program).GetMethod("MyMethod2");
IEnumerable<Type> paramsTypes = m.GetParameters().Select(p => p.ParameterType);
Type methodType = Expression.GetDelegateType(paramsTypes.Append(m.ReturnType).ToArray());
Delegate d = m.CreateDelegate(methodType);
Action a = (Action)d;
a();
}
我得到的是 System.InvalidCastException:无法将类型为 Delegate2$1 的对象转换为在执行“Action a = (Action)d”的行中键入 System.Action。问题是我不知道在 Action 中放入什么类型,因为我知道正确的类型不是 String,它是编译中 String (String&) 的输出等价物。
MyMethod2 有一个输出参数,我认为这就是问题所在,因为当我使用作为输入参数的 MyMethod 对其进行测试时,它起作用了。
public static void MyMethod2(out String outputParameter) {
outputParameter = "hey";
}
public static void MyMethod(String inputParameter) {
//does nothing
}
另外,我知道如果我使用动态调用而不是普通的委托调用会更容易,但我对此不感兴趣,因为我想提高我的程序的性能。有谁知道如何做到这一点?谢谢
是没有Func
或Action
可以使用out
参数。不过,您可以轻松声明自己的委托类型:
public delegate void OutAction<T>(out T arg)
然后您可以使用
OutAction<string> action = (OutAction) m.CreateDelegate(typeof(OutAction<string>));
您将无法使用 Expression.GetDelegateType
,因为它仅支持 Func
和 Action
,但您可以编写自己的等价物来计算出正确的 OutAction<>
根据参数使用的类型,如果您需要动态执行的话。
我正在尝试从具有输出参数的 MethodInfo 对象获取委托。我的代码如下:
static void Main(string[] args) {
MethodInfo m = typeof(Program).GetMethod("MyMethod2");
IEnumerable<Type> paramsTypes = m.GetParameters().Select(p => p.ParameterType);
Type methodType = Expression.GetDelegateType(paramsTypes.Append(m.ReturnType).ToArray());
Delegate d = m.CreateDelegate(methodType);
Action a = (Action)d;
a();
}
我得到的是 System.InvalidCastException:无法将类型为 Delegate2$1 的对象转换为在执行“Action a = (Action)d”的行中键入 System.Action。问题是我不知道在 Action 中放入什么类型,因为我知道正确的类型不是 String,它是编译中 String (String&) 的输出等价物。
MyMethod2 有一个输出参数,我认为这就是问题所在,因为当我使用作为输入参数的 MyMethod 对其进行测试时,它起作用了。
public static void MyMethod2(out String outputParameter) {
outputParameter = "hey";
}
public static void MyMethod(String inputParameter) {
//does nothing
}
另外,我知道如果我使用动态调用而不是普通的委托调用会更容易,但我对此不感兴趣,因为我想提高我的程序的性能。有谁知道如何做到这一点?谢谢
是没有Func
或Action
可以使用out
参数。不过,您可以轻松声明自己的委托类型:
public delegate void OutAction<T>(out T arg)
然后您可以使用
OutAction<string> action = (OutAction) m.CreateDelegate(typeof(OutAction<string>));
您将无法使用 Expression.GetDelegateType
,因为它仅支持 Func
和 Action
,但您可以编写自己的等价物来计算出正确的 OutAction<>
根据参数使用的类型,如果您需要动态执行的话。