c# – MEF:来自Type的GetExportedValue?
发布时间:2020-12-16 00:15:25 所属栏目:百科 来源:网络整理
导读:使用MEF我可以创建并加载这样的类型: var view = Container.GetExportedValueMyView(); 现在我想做的是: Type t = typeof(MyView);var view = Container.GetExportedValuet(); (当然,类型可能包含与MyView不同的内容). 使用泛型GetExportedValue这是不可能
使用MEF我可以创建并加载这样的类型:
var view = Container.GetExportedValue<MyView>(); 现在我想做的是: Type t = typeof(MyView); var view = Container.GetExportedValue<t>(); (当然,类型可能包含与MyView不同的内容). 使用泛型GetExportedValue<>这是不可能的. – 有没有其他方法来实现这一目标? 解决方法
你可以使用反射.
这是一个例子: 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"; } } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |