MEF:从类型获取导出值?

发布于 2024-10-10 13:43:39 字数 332 浏览 3 评论 0原文

使用 MEF,我可以创建并加载这样的类型:

var view = Container.GetExportedValue<MyView>();

现在我想做的是:(

Type t = typeof(MyView);
var view = Container.GetExportedValue<t>();

当然,该类型可能包含与 MyView 不同的内容)。

使用泛型 GetExportedValue<> 是不可能实现这一点的。 - 还有其他方法可以实现这一目标吗?

Using MEF I can create and load a type like this:

var view = Container.GetExportedValue<MyView>();

Now what I want to do is this:

Type t = typeof(MyView);
var view = Container.GetExportedValue<t>();

(of course the type might contain something different than MyView).

This is not possible using the generics GetExportedValue<> - is there some other way to achieve this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

深海蓝天 2024-10-17 13:43:39

您可以使用反射。
这是一个例子:

using System;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.Linq;
using System.Reflection;

namespace WindowsFormsApplication1
{
    static class Program
    {
        [STAThread]
        static void Main()
        {
            AggregateCatalog catalog = new AggregateCatalog();
            catalog.Catalogs.Add(new AssemblyCatalog(typeof(IMessage).Assembly));
            CompositionContainer container = new CompositionContainer(catalog);

            Type t = typeof(IMessage);
            var m = container.GetExportedValue(t);
        }
    }

    public static class CompositionContainerExtension
    {
        public static object GetExportedValue(this ExportProvider container, Type type)
        {
            // get a reference to the GetExportedValue<T> method
            MethodInfo methodInfo = container.GetType().GetMethods()
                                      .Where(d => d.Name == "GetExportedValue"
                                                  && d.GetParameters().Length == 0).First();

            // create an array of the generic types that the GetExportedValue<T> method expects
            Type[] genericTypeArray = new Type[] { type };

            // add the generic types to the method
            methodInfo = methodInfo.MakeGenericMethod(genericTypeArray);

            // invoke GetExportedValue<type>()
            return methodInfo.Invoke(container, null);
        }
    }

    public interface IMessage
    {
        string Message { get; }
    }

    [Export(typeof(IMessage))]
    public class MyMessage : IMessage
    {
        public string Message
        {
            get { return "test"; }
        }
    }
}

You can use reflection.
Here is an example:

using System;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.Linq;
using System.Reflection;

namespace WindowsFormsApplication1
{
    static class Program
    {
        [STAThread]
        static void Main()
        {
            AggregateCatalog catalog = new AggregateCatalog();
            catalog.Catalogs.Add(new AssemblyCatalog(typeof(IMessage).Assembly));
            CompositionContainer container = new CompositionContainer(catalog);

            Type t = typeof(IMessage);
            var m = container.GetExportedValue(t);
        }
    }

    public static class CompositionContainerExtension
    {
        public static object GetExportedValue(this ExportProvider container, Type type)
        {
            // get a reference to the GetExportedValue<T> method
            MethodInfo methodInfo = container.GetType().GetMethods()
                                      .Where(d => d.Name == "GetExportedValue"
                                                  && d.GetParameters().Length == 0).First();

            // create an array of the generic types that the GetExportedValue<T> method expects
            Type[] genericTypeArray = new Type[] { type };

            // add the generic types to the method
            methodInfo = methodInfo.MakeGenericMethod(genericTypeArray);

            // invoke GetExportedValue<type>()
            return methodInfo.Invoke(container, null);
        }
    }

    public interface IMessage
    {
        string Message { get; }
    }

    [Export(typeof(IMessage))]
    public class MyMessage : IMessage
    {
        public string Message
        {
            get { return "test"; }
        }
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文