首页 > 解决方案 > 如何使用 *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;
}

标签: pluginsreflectionmefcomposition

解决方案


推荐阅读