我有一种情况,我希望在多个程序集中实现相同的类型,但让它们在编译器中显示为"相同"类型。
为什么我要这样做?我正在NuGet包中实现一些基类库,所以我可以更容易地在新项目中使用它们。由于这些新项目可能是WPF应用程序或UWP应用程序,因此其中一些NuGet程序包将在其中包含多个程序集,并在适当的时候针对不同的框架。
考虑以下设计方案。我有一个NuGet包,包含.Net Framework 4.6,Windows 8.1和UWP的类库程序集。它们都实现了具有完全相同签名的IExample
。然后,我创建了一个针对.Net Framework 4.5和Windows 8的PCL,其中包含此NuGet包,并定义了一个实现ExampleClass
的{{1}}。然后,在针对.Net Framework 4.6的WPF应用程序中,我包含了相同的NuGet包和PCL并实例化IExample
。我希望能够测试我的ExampleClass
实例是否与ExampleClass
兼容,即使PCL中IExample
的实现使用的ExampleClass
声明与IExample
不同IExample
1)}在WPF应用程序中用于测试类实例的类型兼容性。
var myClass = new ExampleClass();
if (myClass is IExample)
{
// class is an example, do something useful.
}
当我在一个简单的测试应用程序中尝试这样的东西时,Visual Studio在is
表达式上显示代码气味,表明测试永远不会成立。即使我在接口的所有声明中添加了相同的GUID,问题仍然存在。
我认为这一定是可能的,因为看起来微软在他们的一些NuGet包中做了类似的事情。例如,Microsoft BCL Portability Pack状态的描述:
这些类型是统一的"他们的后期版本相当于。例如,在.NET Framework 4.5上运行时,运行时将看到此程序包中的IProgress与平台中已有的类型相同。
需要什么类型的GUID才能使它的多个声明看起来与编译器相同?