«Пакет обеспечения совместимости» для переноса новых функций .NET Framework?

По разным причинам я часто Желательно написать код, совместимый с .NET Framework 2.0 или 3.5 или с .NET Compact Framework, но проблема в том, что в новых .NET-фреймворках есть множество «небольших» функций, которые недоступны в более старых версиях. фреймворки или Compact Framework.

Например, я считаю, что методы расширения действительно полезны, но для этого компилятор зависит от System.Runtime.CompilerServices.ExtensionAttribute . Вы можете легко определить этот атрибут самостоятельно, а затем использовать методы расширения в .NET Framework 2.0 (в C # 3.0+). Аналогично, не так уж сложно вручную определить небольшие типы .NET 4, такие как Tuple и Lazy . Кстати, если вы хотите использовать LINQ в .NET 2.0, вы можете использовать LinqBridge .

Теперь предположим, что вы сделали ExtensionAttribute общедоступным, чтобы другие сборки, которые вы пишете, могли использовать Это. Поначалу это нормально, но что если вы захотите использовать стороннюю библиотеку, которая тоже имела такую ​​же идею? Вы добавляете ссылку на эту библиотеку, и теперь у вас есть столкновение имен. Упс.

Я также заметил, что некоторые новые библиотеки доступны только для .NET 4. 0 или 3.5, даже если они имеют только незначительные зависимости, которые могут быть разрешены с помощью пакета совместимости или LinqBridge.

Было бы неплохо, если бы существовали «пакеты совместимости» для более старых версий .NET, которые определяли эти небольшие функции в небольшая DLL, которую вы могли бы обосновать, в том числе в проектах любого размера. Существует ли такая вещь?

Обновление : Судя по тишине, я думаю, что такой вещи нет. Я мог бы сделать такую ​​библиотеку OSS самостоятельно, если есть интерес. Итак, мой новый вопрос: какие меньшие возможности .NET 4 (в отличие от монстров, таких как WCF / WPF) вы бы упустили, если бы писали для .NET 2, .NET 3.5, .NETCF или Silverlight? Я начну список с ...

  • ExtensionAttribute (не в .NET 2)
  • Func <...> и Action <...> делегаты (не в .NET 2)
  • LINQ-to-objects (не в .NET 2)
  • Tuple <...> (не в .NET 3.5)
  • Lazy < T> и Lazy (не в .NET 3.5)
  • Деревья выражений (не в .NET 2; неполные в .NET 3.5)
  • Родовая дисперсия (существует в .NET 2, но недоступен из C # 3 и VB 9)
  • Reflection.Emit (отсутствует в .NETCF; на самом деле это не маленькая особенность, но я очень по ней скучаю)
------- --121 -------- 982782 ---- Строки AutoMapper для описания перечислений С учетом требования: взять граф объекта, установить все свойства типа перечисления на основе обработанного значения второй строки имущество. Соглашение диктует, что имя свойства строки источника ...

Учитывая требование:

Возьмите граф объекта, установить все свойства типа enum на основе обработанного значения свойства второй строки. Соглашение предписывает, что именем свойства строки источника будет имя свойства enum с постфиксом «Raw».

Под обработкой мы подразумеваем, что нам нужно будет удалить заданные символы и т. Д.

Я рассмотрел пользовательские средства форматирования, преобразователи значений и преобразователи типов, ни один из которых не кажется решением для этого?

Мы хотим использовать AutoMapper в отличие от нашей собственной процедуры отражения по двум причинам: а) он широко используется в остальной части проекта и б) он дает вам рекурсивный обход.

- Пример -

Учитывая (простую) структуру, представленную ниже, и это:

var tmp = new SimpleClass 
  { 
       CountryRaw = "United States",
       Person = new Person { GenderRaw="Male" }
  };

var tmp2 = new SimpleClass();

Mapper.Map(tmp, tmp2);

мы ожидаем, что перечисление MappedCountry в tmp2 будет иметь значение Country.UnitedStates, а свойство Person будет иметь пол Gender.Male. А-> Б B-> а } Это создает Вместо этого я хочу, чтобы один край был показан между A и B, но с двойной стрелкой. Я знаю ...

Вот очень упрощенный пример моего точечного графа:

strict digraph graphName {
A->B
B->A
}

Это создает alt text

Вместо этого я хочу показать один край между A и B, но с двойной стрелкой. Я знаю, как получить двойную стрелку как глобальную опцию:

strict digraph graphName {
  edge [dir="both"]
A->B
B->A
}

Но это выглядит очень уродливо, и не все мои ребра должны быть двуглавыми.

alt text

Если я буду больше обрабатывать график и сам обнаружу двойную ссылку и заменить два края одним краем, это выглядит хорошо. Но я бы предпочел не делать этот дополнительный шаг

strict digraph graphName {
A->B [dir="both"]
}

alt text

. Есть ли лучшие решения?

68
задан Dan Rosenstark 21 November 2019 в 23:24
поделиться