Как Вы осуществили бы рефакторинг, “включают Тип”, чтобы быть полиморфным, если Вы не управляете включенными типами?

РЕШЕНИЕ: Я нашел очень хороший скрипт на python , который генерирует скелет для приложения фляги и создает базовую конфигурацию lighttpd.

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

Я установил flup==1.0.3.dev-20110405 версию и изменил интерпретатор python3 на python2 в моем файле *.fcgi.

И еще я хочу сказать, что я удалил 118 строку:

input("Press enter to continue (if everything is okay)..."), потому что по какой-то причине у меня было исключение.

Надеюсь, мой ответ кому-нибудь поможет.

8
задан Mike Spross 18 February 2009 в 22:35
поделиться

3 ответа

Подход Mehrdad является в основном тем, из которого я предложил бы для начала, но как первый шаг потенциально больше.

Можно использовать простое IDictionary<Type,Delegate> (откуда каждая запись на самом деле T кому: Func<ParseContext,T> - но этого нельзя выразить дженериками) для единственных типов (строки, примитивы и т.д.), но затем Вы также захотите проверить на списки, карты и т.д. Вы не сможете сделать это использование карты, потому что у Вас должна была бы быть запись для каждого типа списка (т.е. отдельная запись для List<string>, List<int> и т.д.). Дженерики делают это довольно хитрым - если Вы рады ограничить себя просто определенными конкретными типами такой как List<T> Вы поможете себе (но менее гибкий). Например, обнаружение List<T> просто:

if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(List<>))
{
    // Handle lists
    // use type.GetGenericArguments() to work out the element type
}

Обнаружьте, реализует ли тип IList<T> для некоторых T (и затем обнаружение T) может быть боль, тем более, что могло быть несколько реализаций, и сам конкретный тип может или не может быть универсальным. Это усилие могло стоить, если бы Вам действительно нужна очень гибкая библиотека, пользовавшаяся тысячами разработчиков - но иначе я сохранил бы его простым.

5
ответ дан 5 December 2019 в 15:26
поделиться

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

4
ответ дан 5 December 2019 в 15:26
поделиться

Это - очень похожая проблема к тому, с чем стоит мой механизм сериализации (protobuf-сеть). Я просто разламываю его на единые наборы логики - IList<T> и т.д. (хотя существует большая логика/проверка печатания для обработки различных примитивов). Подход, который я использую: только сделайте это, после того как... создают interface/base-class-based модель, которая может обработать свойства различных типов, и работать оттуда. Я делаю это в статическом инициализаторе универсального класса кэша - т.е. Foo<T>; когда T HCard, Я предварительно вычисляю модель (т.е. Я создаю объект на свойство, который может анализировать/представлять то свойство, и хранить их), который позволяет мне обработать HCard больше не думая позже.

Я не говорю, что это - лучший код земли, но это, кажется, работает хорошо.

2
ответ дан 5 December 2019 в 15:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: