如何将 ConfigurationSection 属性 作为 System.Type

How do I get ConfigurationSection property as a System.Type

我想定义一个自定义配置部分并让 属性 不产生字符串而是产生 system.type(如果用户输入大量垃圾则为 null)

例如:

<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,将它保留为字符串然后在应用程序中进行类型查找似乎太弱了。这并不难做,只是当我知道我正在寻找一种类型时似乎毫无意义,必须明确地做它的价值是什么。

首先,最好使用 fully qualified name 在您的设置中定义一个类型。这样,从 string.

解析 Type 的问题就会减少

其次,您需要通过 Type 的字符串名称找到 Type,正如在 Convert String to Type in C# 中已经回答的那样,因为仅仅将 string 转换为 Type 是不可能的。

你的情况是:

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

尝试使用将为您进行转换的 TypeConverterAttribute。这对我有用。

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