0

http://msdn.microsoft.com/en-us/library/system.configuration.configurationpropertyattribute.aspx

構成プロパティとしての不変型

以下の QueueConfiguration クラスでは、QueueID は int を返します。コードを実行すると、getter にアクセスするときに次のエラーが発生します。プロパティ 'queueID' の値を解析できません。エラー: タイプ 'Int32' のプロパティ 'queueID' の文字列との間の変換をサポートするコンバーターが見つかりません。

文字列を返すように QueueID を変更すると、正常に動作します。上記のマイクロソフトのリンクでは、ポート プロパティを int として返すために型コンバーターは必要ないことに注意してください。明らかな何かが欠けていると思います......

public class QueueConfiguration : ConfigurationSection
{
    [ConfigurationProperty("queueID", DefaultValue = (int)0, IsKey = true, IsRequired = true)]        
    public int QueueID
    {
        get 
        {
            return (int)this["queueID"];
        }
        set { this["queueID"] = value; }
    }

    [ConfigurationProperty("queueName", DefaultValue = "", IsKey = false, IsRequired = true)]
    public string QueueName
    {
        get { return (string)this["queueName"]; }
        set { this["queueName"] = value; }
    }
}


public class QueueConfigurationCollection : ConfigurationElementCollection
{
    internal const string PropertyName = "QueueConfiguration";

    public override ConfigurationElementCollectionType CollectionType
    {
        get
        {
            return ConfigurationElementCollectionType.BasicMapAlternate;
        }
    }

    protected override string ElementName
    {
        get
        {
            return PropertyName;
        }
    }

    protected override bool IsElementName(string elementName)
    {
        return elementName.Equals(PropertyName, StringComparison.InvariantCultureIgnoreCase);
    }


    public override bool IsReadOnly()
    {
        return false;
    }


    protected override ConfigurationElement CreateNewElement()
    {
        return new QueueConfiguration();
    }

    protected override object GetElementKey(ConfigurationElement element)
    {
        return ((QueueConfiguration)(element)).QueueID;
    }

    public QueueConfiguration this[int idx]
    {
        get
        {
            return (QueueConfiguration)BaseGet(idx);
        }
    }
}

public class QueueConfigurationSection : ConfigurationSection
{
    [ConfigurationProperty("Queues")]
    public QueueConfigurationCollection Queues
    {
        get { return ((QueueConfigurationCollection)(this["Queues"])); }
        set { this["Queues"] = value; }
    }
}

これが私のApp.configです(何らかの理由で、このサイトはアプリ構成のconfigSection部分を表示することを拒否しているため、それを壊すために最善を尽くします:

<configSections>
 <section name="QueueConfigurations" type="STPMonitor.Common.QueueConfigurationSection, STPMonitor"/> 
</configSections>

<QueueConfigurations>
<Queues>
  <QueueConfiguration queueID="1" queueName="One"></QueueConfiguration>
  <QueueConfiguration queueID="2" queueName="Two"></QueueConfiguration>
</Queues>
</QueueConfigurations>
4

1 に答える 1

1

さて、私はあなたのコードをコピーして貼り付けて試しましたが、エラーなしで動作します。私が読んだコードは次のとおりです。

var section = ConfigurationManager.GetSection("QueueConfigurations") as QueueConfigurationSection;
var queueId = section.Queues[0].QueueID;
Console.Out.WriteLine("queueId = {0}", queueId);

そしてそれは印刷しますqueueId = 1

ここに要点があります:https ://gist.github.com/b8499dcfa7456624f073

于 2012-09-19T23:16:11.190 に答える