Преобразовать имя формы в объект формы в c # .net - PullRequest
1 голос
/ 03 ноября 2010

Я хочу преобразовать строковое имя формы в Winform Object, чтобы показать форму. В проекте строковое имя формы получается из таблицы заголовков базы данных, а ее конструктор получает из своей таблицы подробностей.

Вотструктура стола

   *HEADER TABLE*
    ID,Name

   *DETAIL TABLE*
   ID,Constructor_Name,Constructor_Value

Ответы [ 2 ]

4 голосов
/ 03 ноября 2010

Вообще. DB и пользовательский интерфейс находятся на таких противоположных концах, что я бы порекомендовал не хранить фактическое имя winform, а вместо этого хранить какой-либо строковый токен / перечисление и просто использовать переключатель:

switch(formName) {
    case "OrderInfo": return new OrderInfoForm(ctorValue);
    case "CustomerSearch": return new CustomerSearchForm();
    // etc
}

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

Однако вы можете использовать отражение. Если у вас есть полное имя сборки, то:

Type type = Type.GetType(name);

в противном случае, если вы просто определите пространство имен, в идеале вы должны сначала получить Assembly:

Assembly asm = typeof(SomeTypeInTheSameAssembly).Assembly;
Type type = asm.GetType(name);

Тогда просто:

Form form = (Form)Activator.CreateInstance(type, ctorValues);
2 голосов
/ 03 ноября 2010

Для этого вам потребуется использовать отражение.

Используйте Type.GetType(string), чтобы получить объект Type по его имени, а затем либо вызвать Activator.CreateInstance(), чтобы создать экземпляр, или получить конкретный конструктор с помощью Type.GetConstructor(), а затем вызвать ConstructorInfo.Invoke(), чтобы вызвать его.

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

Следует учитывать одну вещь, каковы типы параметров вашего конструктора и как связать каждый параметр конструктора с конкретнымстрока в таблице.У ваших форм есть несколько параметров?Существуют ли какие-либо сложные значения или они являются строками, целыми числами и т. Д.?

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