如何通过反射创建第三方程序集内部类实例并传入其内部定义的委托参数
正确实现代码
核心思路是先通过反射获取到目标内部委托的类型,再通过Delegate.CreateDelegate将你的方法绑定为该委托类型的实例,再传入构造函数即可。
// 你的回调方法保持不变 public static object SomeDelegateImplementation(object value) { return value; } public void Main() { // 1. 获取第三方程序集和SomeClass类型 var assembly = typeof(ThirdParty.OtherClass).Assembly; var someClassType = assembly.GetType("ThirdParty.SomeClass", true, true); // 2. 获取嵌套在SomeClass内部的SomeDelegate委托类型 var delegateType = someClassType.GetNestedType("SomeDelegate", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance); // 3. 将你的实现方法创建为对应目标委托类型的实例 // 注意将下方的<当前定义回调方法的类名>替换为你实际的类名 var targetDelegate = Delegate.CreateDelegate( type: delegateType, method: typeof(<当前定义回调方法的类名>).GetMethod(nameof(SomeDelegateImplementation), System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static) ); // 4. 调用构造函数创建实例 var ctor = someClassType.GetConstructors()[0]; var instance = ctor.Invoke(new object[] { targetDelegate }); }
原有方案失败原因
- 方法一:编译器无法将方法组自动转换为
object类型,你没有指定要将方法转换为哪种委托类型,因此直接抛出编译错误。 - 方法二:
Func<object, object>和ThirdParty.SomeClass+SomeDelegate是完全独立的两个委托类型,即使签名完全匹配,运行时也不支持直接跨类型转换,因此抛出类型转换异常。
注意事项
如果你的SomeDelegateImplementation是实例方法而非静态方法,调用Delegate.CreateDelegate时需要额外传入方法所属的实例对象作为第二个参数,再传入方法的MethodInfo即可。
内容的提问来源于stack exchange,提问作者Jürgen Steinblock
相关产品推荐
相关产品推荐

