РЕШЕНИЕ: Я нашел очень хороший скрипт на python , который генерирует скелет для приложения фляги и создает базовую конфигурацию lighttpd.
И это сработало для меня очень хорошо, за исключением того, что у меня был конфликт с flup
библиотекой.
Я установил flup==1.0.3.dev-20110405
версию и изменил интерпретатор python3
на python2
в моем файле *.fcgi
.
И еще я хочу сказать, что я удалил 118
строку:
input("Press enter to continue (if everything is okay)...")
, потому что по какой-то причине у меня было исключение.
Надеюсь, мой ответ кому-нибудь поможет.
Подход 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
) может быть боль, тем более, что могло быть несколько реализаций, и сам конкретный тип может или не может быть универсальным. Это усилие могло стоить, если бы Вам действительно нужна очень гибкая библиотека, пользовавшаяся тысячами разработчиков - но иначе я сохранил бы его простым.
Вместо большого оператора переключения можно создать словарь, который отображает строку на делегата, и ищите ее, когда Вы хотите проанализировать использование соответствующего метода.
Это - очень похожая проблема к тому, с чем стоит мой механизм сериализации (protobuf-сеть). Я просто разламываю его на единые наборы логики - IList<T>
и т.д. (хотя существует большая логика/проверка печатания для обработки различных примитивов). Подход, который я использую: только сделайте это, после того как... создают interface/base-class-based модель, которая может обработать свойства различных типов, и работать оттуда. Я делаю это в статическом инициализаторе универсального класса кэша - т.е. Foo<T>
; когда T HCard
, Я предварительно вычисляю модель (т.е. Я создаю объект на свойство, который может анализировать/представлять то свойство, и хранить их), который позволяет мне обработать HCard
больше не думая позже.
Я не говорю, что это - лучший код земли, но это, кажется, работает хорошо.