Вообще. 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);