Plugins 如何使用*attributeless*MEF 2.0导出与特定签名匹配的方法?

Plugins 如何使用*attributeless*MEF 2.0导出与特定签名匹配的方法?,plugins,reflection,mef,composition,Plugins,Reflection,Mef,Composition,我对使用外部程序集作为插件感兴趣。我希望能够在方法满足某个签名的情况下从随机程序集中导出方法,并将它们作为方法代理导入,而不是基于接口进行导入/导出。我以前通过自定义反射代码来实现这一点,但我更愿意使用Microsoft的内置功能。不幸的是,MEF v2的文档非常缺乏 因此,如何更改此设置以成功创建方法代理: [Test()] public void ProxyTest() { var builder = new ConventionBuilder(); var filter

我对使用外部程序集作为插件感兴趣。我希望能够在方法满足某个签名的情况下从随机程序集中导出方法,并将它们作为方法代理导入,而不是基于接口进行导入/导出。我以前通过自定义反射代码来实现这一点,但我更愿意使用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;
}
[Test()]
公共无效ProxyTest()
{
var builder=new ConventionBuilder();
var filter=newmemberfilter((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();
var host=new ContainerConfiguration().WithAssembly(this.GetType().Assembly,builder).CreateContainer();
var container=新的ProxyContainer();
host.SatisfyImports(容器);
}
公共类代理容器
{
[进口数量]
公共可数懒散法
{
得到;
设置
}
[进口数量]
公共IEnumerable代理方法
{
得到;
设置
}
}
公共静态类静态对象
{
公共静态任务MyStaticMethod()=>
Task.FromResult(true);
}
公共类实例
{
公共任务MyInstanceMethod()=>
Task.FromResult(true);
}
带有staticthing的公共类实例
{
公共静态任务MyStaticMethod()=>
Task.FromResult(true);
}
公共静态类ReflectionExtensions
{
public const BindingFlags Everything=BindingFlags.Instance | BindingFlags.public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.flatterhierarchy;
公共静态bool IsBoolTask(此MethodInfo方法)=>
null!=方法&&
typeof(Task)==method.ReturnType;
}