我正在尝试使用反射将MethodInfo
转换为Func<T,TResult>
。到目前为止,我的代码在某些情况下似乎可以正常工作,但是我无法创建具有从另一代码派生的参数类型的Func
。我缺少了一些东西,但不幸的是,我不知道该如何进行。我想某种Expression.Convert()
会井然有序,如果可以,那么在哪里以及如何?
这是一个简短的程序,用于测试我要达到的目标。可以将其复制粘贴到https://dotnetfiddle.net/
并进行编译。
using System;
using System.Linq.Expressions;
public class Program
{
public static void Main()
{
var myobject = new MyClass();
var methodInfo = myobject.GetType().GetMethod("HelloThere");
var parameterType = methodInfo.GetParameters()[0].ParameterType;
var parameterExpression = Expression.Parameter(parameterType);
var callExpression = Expression.Call(Expression.Constant(myobject),methodInfo,parameterExpression);
var compiledFunction = Expression.Lambda<Func<EventArgs,string>>(callExpression,parameterExpression).Compile();
}
public class MyClass
{
public string HelloThere(StringEventArgs args)
{
return "General Kenobi";
}
}
public class StringEventArgs : EventArgs
{
public StringEventArgs(string aString)
{
Value = aString;
}
public string Value { get; set; }
}
}
但是,在运行时会引发以下错误:
Run-time exception (line 13): ParameterExpression of type 'Program+StringEventArgs' cannot be used for delegate parameter of type 'System.EventArgs'