5

Web.configファイルに次のセクションがあります。

<configSections>
    <section name="mySection" type="myNameSpace, myProject"/>
</configSections>


<mySection>
    <city id="ny" type="nameSpace1" />
    <city id="dc" type="nameSpace2" />
    <city id="nj" type="nameSpace3" />
</mySection>

cities指定されたをループしてidを返すコードを記述する必要がありますtype

すなわち

 if the given id = "ny" --> return nameSpace1
 if the given id = "dc" --> return nameSpace2
 if the given id = "nj" --> return nameSpace3
4

2 に答える 2

1

次のセクションへの参照が必要です。

var theSection = (TypeOfSection)ConfigurationManager.GetSection("mySection");

へのキャストに注意してくださいTypeOfSection- これは構成ファイルで宣言された型です。

この時点で、アクセスして反復できる厳密に型指定されたオブジェクトが必要です。

于 2012-11-13T13:46:48.887 に答える
0

私の回答では、都市のコレクションを持つ ConfigurationSection を実装するクラスを作成したと仮定しました。— オデッド 13 11 月 2012 〜で 13:50 に

この以前の回答は技術的には正しいですが、詳細が不足していると思います。@Oded の応答について詳しく説明しようと思います。うまくいけば、明確な展示になるでしょう。

手順

  1. ここで最初に行うことは、新しいクラスを実装することです。これは、構成ソースに格納する各構成値のプロパティを持つMyConfigSection単なる標準 POCO (Plain Old C Object)です。

    public class MyConfigSection
    {
        public City[] Cities {get; set;}
    }
    

    注: type であるオブジェクトの配列を使用していますCity。これは、特定のユース ケースが必要とする場合に複数のエントリを許可するためですが、特定のタイプに制限されることはありません。この場合、クラスは次のような構造になります。

    public class City
    {
        public string Id {get; set;}
        public string Type {get; set;}
    }
    
  2. mySection選択したソースに構成セクションを作成し、セクションに意図した目的に対応する名前を付けます。この場合、元の質問に一致するようにセクションを呼び出します。

    <mySection>
        <Cities>
            <city Id="ny" Type="nameSpace1" />
            <city Id="dc" Type="nameSpace2" />
            <city Id="nj" Type="nameSpace3" />
        </Cities>
    </mySection>
    
  3. MyConfigSectionここで重要なステップは、 poco を目的の構成設定セクションにバインドすることです。IOptions<T>次のコードをスタートアップ クラスに追加することで、インターフェイスを介さずにこれを実現できます。

    var configSection = new MyConfigSection();
    Configuration.Bind("mySection", configSection);
    services.AddSingleton(configSection);
    
  4. MyConfigSectionバインディングを追加し、結果のオブジェクトをサービス コンテナーに登録した後、前述の構成内に格納された値が必要な任意のメソッドに型の引数を含めるだけで、依存性注入によってコード ベースのどこでも使用できるようになります。

    public Type GetCityType(string cityId, MyConfigSection config)
    {
        var typeName = config.Cities
            .Where(x => x.Id == cityId)
            .Select(x => x.Type);
        return Type.GetType(typeName);
    }
    

    この特定のシナリオでは、追加の poco 型の配列を扱っているという事実により、設定値の使用が少し複雑になりますが、LINQ の助けを借りて、都市から必要な値を取得することは非常に簡単になります。配列。型に対応する文字列を取得して変数に格納した後typeName、リフレクションを使用して、Type上記で示したように単なる文字列ではなく実際のオブジェクトを返すことができます。(GetType()メソッドには、検討する価値のあるいくつかのオーバーロードもあり、指定された名前の型が見つからない場合にどうするか、検索で大文字と小文字を区別するかどうかなどを構成できます。)


この回答が明確であり、あなたの状況に役立つことを願っています。私が完全に回答していない質問がある場合は、コメントを残してください。追加の詳細で回答を更新します!

于 2019-04-18T03:43:11.310 に答える