2015-07-02 2 views
3

Я хочу определить настраиваемый раздел конфигурации и иметь свойство, которое не дает строку, но system.type (или null, если пользователь вводит в нагрузку мусора)Как получить свойство ConfigurationSection в виде System.Type

например:

<myCustomConfig myAnnoyingType="System.String" /> 

в C# (в текущем реальном мире)

[ConfigurationProperty("myAnnoyingType")] 
public string MyAnnoyingType 
{ 
    get { return (string)this["myAnnoyingType"]; } 
} 

// else where in the app 
var stringType = thatConfig.MyAnnoyingType 
var actualType = Type.GetType(stringType); 
// wow that was boring. 

в C# (в идеальном мире)

[ConfigurationProperty("myAnnoyingType")] 
public Type MyAnnoyingType 
{ 
    get { return (Type)this["myAnnoyingType"]; } 
} 

Что я хочу, это НЕ должен содержать элемент как строку в C#, а затем преобразовать его в тип в приложении; я хотел бы, чтобы это выполнялось автоматически как часть ответственности ConfigurationManager.

Возможно ли это? Я в порядке, чтобы использовать TypeConverter, если я должен быть, это просто кажется настолько слабым, чтобы сохранить его как строку, а затем выполнить поиск типа в приложении. Это непросто сделать, просто кажется бессмысленным, когда я знаю, что я ищу тип, какова ценность того, что нужно явно это делать.

ответ

2

Попробуйте использовать TypeConverterAttribute, который будет делать преобразования для вас. Это сработало для меня.

[ConfigurationProperty("type")] 
    [TypeConverter(typeof(TypeNameConverter))] 
    public Type Type 
    { 
     get 
     { 
      return (System.Type)this["type"]; 
     } 
     set 
     { 
      this["type"] = value; 
     } 
    } 
2

Во-первых, лучше определить тип в ваших настройках, используя fully qualified name. Таким образом, вы получаете меньше проблем при разрешении Type от string.

Во-вторых, вам нужно найти Type по его имени строки, как уже был дан ответ в Convert String to Type in C#, потому что это не возможно просто бросить string к Type.

В вашем случае это будет:

[ConfigurationProperty("myAnnoyingType")] 
public Type MyAnnoyingType 
{ 
    get { return Type.GetType(this["myAnnoyingType"]); } 
} 
+0

Я думаю, вы неправильно поняли мой вопрос. я хорошо знаю, как конвертировать из строки в тип, используя .net более 20 минут. мой вопрос заключается в том, как обеспечить автоматическое его выполнение при использовании файлов раздела конфигурации и вообще не делать этого в приложении. , конечно, я могу сохранить его как строку в конфиге, а затем преобразовать эту строку в System.Type в приложении. я не хочу; он должен делать это автоматически в идеале. вот в чем вопрос. – peteisace

+3

На самом деле я несправедлив. хотя это было не то, что я искал, это разумно отвечает на вопрос @kirmir, извините, я был слишком поспешным и слишком суровым. это справедливо, но не совсем то, чем я был. – peteisace

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