Кажется, здесь никто не упоминается, но вы также можете использовать анонимный класс для хранения аргумента generic type (который обычно теряется из-за стирания типа) :
public abstract class TypeHolder<T> {
private final Type type;
public TypeReference() {
// you may do do additional sanity checks here
final Type superClass = getClass().getGenericSuperclass();
this.type = ((ParameterizedType) superClass).getActualTypeArguments()[0];
}
public final Type getType() {
return this.type;
}
}
Если вы экземпляр этого класса анонимным способом
TypeHolder<List<String>, Map<Ineger, Long>> holder =
new TypeHolder<List<String>, Map<Ineger, Long>>() {};
, тогда такой экземпляр holder
будет содержать неидентифицированное определение пройденного типа.
Это очень удобно для создания валидаторов / десериализаторов. Кроме того, вы можете создавать типичный тип с отражением (так что если вы когда-либо хотели сделать new T()
в параметризованном типе - приветствуется!) [/ G1].
Это немного «взломано», но вы можете добавить параметр в свой конструктор (неиспользуемый?), Использовать этот конструктор везде и создать конструктор по умолчанию от дизайнера не доставит вам никаких проблем.
Вы можете использовать что-то вроде SqlMetal для создания собственного файла конструктора DataContext, но вы правы - DataContext по умолчанию довольно сложно открыть.
Другой вариант - получить DataContext из фабричного метода, чтобы можно было скрыть, какой конструктор фактически используется. Еще лучше, если вы сделаете это через фреймворк IoC, такой как Castle Windsor. Тогда вы сможете делать что-то вроде:
var context = container.Resolve<DataContext>();
Находясь в дизайнере DBML, вы можете щелкнуть правой кнопкой мыши на любом белом месте и выбрать "Свойства" (это не то же самое, что щелкнуть правой кнопкой мыши на файле DBML и выбрать "Свойства"). Оттуда разверните опцию "Подключение". Установите "Application Settings" на False и очистите параметр "Connection String". Эти параметры используются дизайнером для создания конструктора по умолчанию.
После этого вы можете использовать созданный вами конструктор по умолчанию вне файла designer.cs. К сожалению, вам придется повторять этот процесс каждый раз, когда вы будете добавлять новые таблицы в конструктор. Это раздражает, и я чувствую вашу боль.