通过反射创建委托

时间:2010-06-11 15:54:06

标签: c# reflection .net-3.5 delegates

给定包含

的程序集
namespace Foo{public class Bar;}

如何在不编译时引用第一个程序集的情况下从另一个程序集创建Action<Foo.Bar>

2 个答案:

答案 0 :(得分:10)

如果您使用

Type barType = Type.GetType("Foo.Bar, whateverassembly");
Type actionType = typeof(Action<>).MakeGenericType(barType);

actionType现在代表Action<Foo.Bar>。但是,要使用它,您需要使用反射,因此您需要找到符合签名MethodInfo的{​​{1}},并调用void(Foo.Bar)来创建代理。你需要Delegate.CreateDelegate来执行它。

Delegate.DynamicInvoke

有些东西告诉我,这不是你想的......

答案 1 :(得分:3)

您不能在调用代码中调用它Action<Foo.Bar>,因为如果您在编译时没有引用它,则无法访问该类型定义。由于委托是逆变的,您可以返回Action<Object>并使用它,或者使用Action<IBar>,其中IBar接口在引用的程序集中定义,并由Foo.Bar实现。< / p>

如果您确实返回Action<Object>,则必须通过反射使用Foo.Bar成员(如果使用C#4.0,则使用dynamic)或使用强制转换为Foo.Bar其中,转换代码引用了定义Foo.Bar的程序集。