2017-12-15 5 views
2

を返す私はGetValue<T>方法使用してappsettings.jsonファイルからリストを読み込むしようとしています:configuration.GetValueリストがnull

var builder = new ConfigurationBuilder().SetBasePath(System.AppContext.BaseDirectory) 
       .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true); 

IConfigurationRoot configuration = builder.Build(); 
var rr = configuration.GetValue<IList<ConnectionSettings>>("Connections"); 


public class ConnectionSettings 
{ 
    public string Name { get; set; } 

    public string Host { get; set; } 

    public string Account { get; set; } 

    public string Password { get; set; } 
} 

をし、私のappsettings.json

{ 
"Connections": [ 
    { 
     "Name": "", 
     "Host": "192.168.1.5", 
     "Account": "74687", 
     "Password": "asdsdadsq" 
    }, 
    { 
     "Name": "", 
     "Host": "127.0.0.1", 
     "Account": "45654", 
     "Password": "asdasads" 
    } 
    ] 
} 

問題は、私は常にありますnullを取得し、私はなぜ理解していない。

+0

はい。単一の商品であっても。私はリストを削除し、ちょうど1つのオブジェクトを持つappsettings.jsonを設定する場合ConnectionSettingsそれはまだnullです – pantonis

+0

はい、私はまだnullを取得しています – pantonis

答えて

2

私はgithubの上で、次のを発見している:GetValue not working with lists

かいつまん:それは仕様です。

だから、あなたはこれを試すことができます。

var result = new List<ConnectionSettings>(); 
var rr = configuration.GetSection("Connections").Bind(result); 
+0

真剣に彼らはそれを実装しなかった理由??? :)私はバインドソリューションを避けたかったが、何でも。 – pantonis

0

the documentation for GetValue<>によれば、(単一)のキーの値を取得し、指定した型に変換します。残念ながら、値を変換できない場合はエラーになりません。これは実行中の状況です。

あなたの状況ではGet<>が望ましいと思います。

var rr = configuration.GetSection("Connections").Get<IList<ConnectionSettings>>(); 

Get<>'s documentationによれば、この構成セクションが使用される値を有する場合、型Tの新しいインスタンスに設定インスタンスを結合する

試み。それ以外の場合は、プロパティ名を構成キーと再帰的に照合してバインドします。

この値を直接取得することも、プロパティが見つからない場合は、一致するプロパティを含む入れ子になっているオブジェクトを検索することもできます。

代わりに@AthanasiosKatarasと言うこともできます。 Bind<>を使用してください。これは、一部の値をデフォルト値または計算値のいずれかでオーバーレイしたいスパースな構成を持つ場合に役立ちます。

関連する問題