给定包含
的程序集namespace Foo{public class Bar;}
如何在不编译时引用第一个程序集的情况下从另一个程序集创建Action<Foo.Bar>
?
答案 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
的程序集。