【问题标题】:How do I get ConfigurationSection property as a System.Type如何将 ConfigurationSection 属性作为 System.Type
【发布时间】:2015-09-20 15:49:11
【问题描述】:

我想定义一个自定义配置部分,并且有一个属性不是产生字符串而是产生一个 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,将其保留为字符串然后在应用程序中进行类型查找似乎很弱。这并不难,只是当我知道我正在寻找一种类型时似乎毫无意义,必须明确地这样做有什么价值。

【问题讨论】:

    标签: c# configurationmanager


    【解决方案1】:

    首先,最好使用fully qualified name 在您的设置中定义一个类型。这样,您从string 解决Type 的问题就会减少。

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

    在你的情况下是:

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

    【讨论】:

    • 我想你误解了我的问题。我很清楚如何从字符串转换为类型,使用 .net 超过 20 分钟。我的问题是关于如何确保在使用配置节文件时自动完成此操作,而根本不必在应用程序中执行此操作。当然,我可以将其作为字符串保存在配置中,然后将该字符串转换为应用程序中的 System.Type。我不想;理想情况下它应该自动完成。这就是问题所在。
    • 其实我不公平。虽然这不是我想要的,但这确实合理地回答了@kirmir 的问题,对不起,我太仓促太苛刻了。这是公平的,虽然不是我想要的。
    【解决方案2】:

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

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

    【讨论】:

    • 这确实非常有效,以防您的预期行为实际上是当此代码的用户使用类型名称出错时整个配置部分无法加载。并不是说它不应该是预期的行为,但可能并非总是如此。
    猜你喜欢
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    • 2017-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多