2012-11-15 6 views
1

У меня есть небольшая проблема: У меня есть метод, который анализирует входящую строку для определенных значений, если значение найдено, создается новый класс. Имя класса идентично разборной строке. На данный момент мой код выглядит следующим образом:Сравнение String с именем класса

Public Class Test1 
End Class 

Public Class Important 
End Class 

Public Class DoWork 
Public Sub DoWork(incoming as String) 
Select case incoming 
case "Test1" 
dim myobj as new Test1 
Case "Important" 
dim myobj as new Important 
End Select 
End Sub 
End Class 

Я не люблю строковые литералы, как «Test1» - я мог бы хранить их в постоянной, но если имена классов изменятся, они должны быть изменены слишком , Есть ли способ заменить литералы названием класса? Я знаю, что me.gettype производит результат для экземпляров объектов, но как насчет простого имени для класса, который в данный момент не является объектом?

ответ

2

Если ваша строка находится в правильном формате, вы можете использовать метод Type.GetType(string) для извлечения типа. Затем вы можете использовать класс Activator для создания экземпляра, если у вас есть конструктор по умолчанию для этого типа.

+0

Я не уверен, что это лучше, строковый литерал все еще существует в Type.GetType («Test1»). Имя:/ –

+0

@ChristianSauer: Нет, вы делаете: Type.GetType (входящий) –

+0

Thx, now Я получил Идею! –

1

Ответ Рафаля хорош, если вы застряли в текущей ситуации с параметром входящей строки. Но это все еще немного хрупко. Что делать, если входящий параметр изменяется? Что делать, если вы хотите перестроить свой код, перемещая некоторые классы в разные пространства имен или сборки? Что делать, если эти строки меняются - вам теперь нужно переименовывать свои классы и перекомпилировать? Вы явно не видите магические строки, но они все еще там.

Так спросите себя - откуда взялись эти струны? Они генерируются внутри вашего кода? Если это так, вам может понадобиться генерировать вместо строк значение Enum, соответствующее экземпляру класса. Если они являются внешними строками, которые вы сопоставляете с вашими классами, подумайте о наличии явного сопоставления (например, в файле конфигурации), который отображает String-> Type. Это немного более громоздко, но намного более гибко.

+0

Они внешние струны - но они под моим контролем. Но вы, безусловно, правы - это хрупкое решение. У вас есть идея, как может понравиться такой файл конфигурации? –

+1

Простой список пар ключ-значение с входящей строкой в ​​качестве ключа и полным именем типа в качестве значения должен быть простейшим. Там есть много ресурсов для создания пользовательских конфигурационных разделов для вашего файла app.config, хотя я должен признать, что весь процесс немного более громоздкий, чем он должен быть. Вот один из них: http://haacked.com/archive/2007/03/11/custom-configuration-sections-in-3-easy-steps.aspx –

Смежные вопросы