plugins - 如何使用 *attributeless* MEF 2.0 导出匹配特定签名的方法?
问题描述
我对使用外部程序集作为插件感兴趣。我希望能够在方法满足特定签名的情况下从随机程序集中导出方法并将它们作为方法代理导入,而不是基于接口的导入/导出。我之前通过自定义反射代码完成了此操作,但我更愿意使用 Microsoft 的内置功能。不幸的是,MEF v2 的文档非常缺乏。
那么如何更改它以成功创建方法代理:
[Test()]
public void ProxyTest()
{
var builder = new ConventionBuilder();
var filter = new MemberFilter((info, obj) => info.DeclaringType != typeof(object) && info.MemberType == MemberTypes.Method && ((MethodInfo)info).IsBoolTask());
builder.ForTypesMatching((classType) => classType.FindMembers(MemberTypes.Method, ReflectionExtensions.Everything, filter, null).Any()).Export<Func<Task<bool>>>();
var host = new ContainerConfiguration().WithAssembly(this.GetType().Assembly, builder).CreateContainer();
var container = new ProxyContainer();
host.SatisfyImports(container);
}
public class ProxyContainer
{
[ImportMany]
public IEnumerable<Lazy<Func<Task<bool>>>> LazyProxyMethod
{
get;
set;
}
[ImportMany]
public IEnumerable<Func<Task<bool>>> ProxyMethods
{
get;
set;
}
}
public static class StaticThing
{
public static Task<bool> MyStaticMethod() =>
Task.FromResult(true);
}
public class InstanceThing
{
public Task<bool> MyInstanceMethod() =>
Task.FromResult(true);
}
public class InstanceWithStaticThing
{
public static Task<bool> MyStaticMethod() =>
Task.FromResult(true);
}
public static class ReflectionExtensions
{
public const BindingFlags Everything = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.FlattenHierarchy;
public static bool IsBoolTask(this MethodInfo method) =>
null != method &&
typeof(Task<bool>) == method.ReturnType;
}
解决方案
推荐阅读
- android - 如何限制用户在 Jitsi 电话会议中打开音频和视频?
- reactjs - React JS如何修复无法添加属性更新器,对象不可扩展,使用'This'时
- r - 您如何在 R 中的分布函数中找到未知数?
- python - Python:如何计算数据框中所有点之间的距离?
- r - xts 对象 - 添加缺失的日期
- python - Pandas 使用 Dataframe 对象的变量
- r - 在 Python 中生成所有可能的对并计算频率
- c++ - CreateThread 和 CreateRemoteThread 的 lpParameter 有什么区别?
- three.js - instancedMesh:顶点会失去精度
- java - org.springframework.dao.OptimisticLockingFailureException 与休眠升级