我们使用 MEF Contrib 开放泛型支持,如下所示:
[InheritedExport]
interface ITest2<T>
{
void Execute();
}
class TestClass2<T> : ITest2<T>
{
public void Execute()
{
Console.WriteLine();
}
}
class Program
{
static void Main(string[] args)
{
var catalog = new AssemblyCatalog(typeof(Program).Assembly);
var container = new CompositionContainer(catalog);
var test2 = container.GetExportedValues<ITest2<string>>();
}
}
但是,由于安装了 .NET Framework 4.5,此代码不再有效。它不仅在针对 .NET 4.5 或 .NET 4.0 构建后不再起作用,而且还会破坏现有的已编译应用程序。
似乎必须在 TestClass2 上使用显式 [Export(typeof(ITest2<>))] 属性,或者更改定义:
[InheritedExport(typeof(ITest2<>))]
interface ITest2<T>
{
void Execute();
}
有谁知道为什么这会改变?奇怪的是,MEF 的开放泛型支持(在 4.5 中)也因开放泛型接口上的非类型化 [InheritedExport] 属性而失败。
我会认为 [InheritedExport] 在开放通用接口上的默认行为与 [InheritedExport(typeof(ITest2<>))] 相同。
谢谢,史蒂夫