Реализация унифицированных типов в нескольких сборках

У меня есть ситуация, в которой я хотел бы реализовать один и тот же тип в нескольких сборках, но чтобы они казались компилятору "одинаковым" типом.

Зачем мне это делать? Я нахожусь в процессе реализации некоторых из моих библиотек базовых классов в пакетах NuGet, чтобы мне было легче использовать их в новых проектах. Поскольку этими новыми проектами могут быть, например, приложения WPF или приложения UWP, некоторые из этих пакетов NuGet будут иметь несколько сборок, предназначенных для различных сред, где это необходимо.

Рассмотрим следующий надуманный сценарий. У меня есть пакет NuGet, содержащий сборки библиотеки классов для.Net Framework 4.6, Windows 8.1 и UWP. Все они реализуют IExample с точно такой же подписью. Затем я создаю PCL для.Net Framework 4.5 и Windows 8, который включает в себя этот пакет NuGet и определяет ExampleClass который реализует IExample, Затем в приложении WPF, предназначенном для.Net Framework 4.6, я включаю этот же пакет NuGet, PCL и создаю экземпляр. ExampleClass, Я хочу иметь возможность проверить мой экземпляр ExampleClass для совместимости с IExample хотя реализация ExampleClass в PCL используется другое объявление IExample чем IExample используется в приложении WPF для проверки совместимости типов экземпляра класса.

var myClass = new ExampleClass();
if (myClass is IExample)
{
    // class is an example, do something useful.
}

Когда я попробовал что-то подобное в простом тестовом приложении, Visual Studio отображал запах кода на is выражение, указывающее, что тест никогда не будет правдой. Даже когда я добавил один и тот же GUID во все объявления интерфейса, проблема осталась.

Я предполагаю, что это должно быть возможно, так как кажется, что Microsoft сделала нечто подобное в некоторых из своих пакетов NuGet. Например, описание пакета переносимости Microsoft BCL гласит:

Эти типы "унифицированы" для более поздних версий. Например, при работе в.NET Framework 4.5 IProgress из этого пакета будет восприниматься средой выполнения как тот же тип, что уже доступен в платформе.

Что больше, чем GUID типа, необходимо для того, чтобы несколько его объявлений казались одинаковыми для компилятора?

0 ответов

Другие вопросы по тегам