2017-04-06 17 views
-3

プロパティとして文字列と配列を受け入れる単純なオブジェクトを作成しようとしています。オブジェクトに配列を追加する

これは私がこれを成し遂げるために試した方法です:

public void addToObject() 
{ 
    List<Vars> variable = new List<Vars>(); 
    variable.Add(new Vars { Id = "var1", Name = { "n1", "n2", "n3", "n4" } }); 
} 

public class Vars 
{ 
    public string id { get; set; } 
    public string name { get; set; } 
} 

しかし、それは返します

Cannot initialize type 'ExcelSDRAddIn.UserControlSDR.Vars' with a collection initializer because it does not implement 'System.Collections.IEnumerable'

+0

名は文字列であり、あなたは、コレクションを割り当てます文字列の – jjj

答えて

3

あなたは文字列にリストを追加してみてください。あなたが望むのはList of stringsです。これはあなたのVarsクラスで宣言する必要があります。

public void addToObject() 
{  
    List<Vars> variable = new List<Vars>(); 
    variable.Add(new Vars { Id = "var1", Names = new List<string>(){ "n1", "n2", "n3", "n4" } }); 
} 

public class Vars 
{ 
    public string Id { get; set; } 
    public List<string> Names { get; set; } 
} 

コードhereを実行します。

+0

これはコンパイルされません( '名前'と '名前') –

+0

@ J.Tucはい、誤字。それは今です。 – Jurjen

+0

私はついにそれを手に入れました!ありがとうございました。 – Valip

4

エラーは実際には間違っています。ただし、stringと宣言されているNameのプロパティを参照しています。しかし、コレクション初期化子を使用して初期化します。

また、初期化するプロパティの名前は、クラスで宣言されているものと正確に一致する必要があります。ケーシングの問題がありました。

あなたはおそらく、この代わりにしたい:

public void addToObject() 
{ 
    List<Vars> variable = new List<Vars>(); 
    variable.Add(new Vars { id = "var1", name = { "n1", "n2", "n3", "n4" } }); 
} 

public class Vars 
{ 
    public string id { get; set; } 
    public List<string> name { get; set; } 
} 

EDITは:コレクション初期化子を使用すると、あなたは、コレクションにオブジェクトを追加する前に、コレクションにどこかインスタンスを初期化することを前提としています。あなたがそうであっても、クラスの外から誰がリストを参照するだけで追加設定することができませんプライベート-setterあなたnameを作ることができ、これを言って

public class Vars 
{ 
    public string id { get; set; } 
    public List<string> name { get; set; } 
    public Vars() { this.name = new List<string>(); } 
} 

:だからあなたのVarsにあなたはapropriately nameを設定し、コンストラクタを必要と-classオブジェクトをリストに追加します。

コンストラクタを省略すると、NullReferenceExceptionが発生します。確かにnameは、どのような方法で初期化されていることを前提としてい

var v = new Vars(); 
v.id = "var1"; 
v.name.Add("n1"); 
v.name.Add("n2"); 
v.name.Add("n3"); 
v.name.Add("n4"); 

:コレクション初期化子が内部のようなものに変更されたためです。

+1

'Vars'クラスの名前が' new Vars'オブジェクト宣言の名前に対応していないので、これはコンパイルされません。 – Jurjen

+0

ここにhttp://rextester.com/IEQP33447のコードを追加し、 'オブジェクト参照がオブジェクトのインスタンスに設定されていません.' ...任意のアイデア何が間違っていますか? – Valip

+0

@Valip私の編集を参照してください。 – HimBromBeere

0

クラスVarsでは、名前はリストで、タイプは文字列です。これはあなたを助けることはできません。

public void addToObject() 
{ 
    List<Vars> variable = new List<Vars>(); 
    variable.Add(new Vars { id = "var1", name = new List<string> { "n1", "n2", "n3", "n4" } }); 
} 

public class Vars 
{ 
    public string id { get; set; } 
    public List<string> name { get; set; } 
} 

私のスニペットを使用してください、これはあなたの問題を解決します。

+0

これは次のエラーを返します: 'オブジェクト参照がオブジェクトのインスタンスに設定されていません。 ' – Valip

+0

ここでコードを確認できます:http://rextester.com/IEQP33447 – Valip

+0

static void Main(string [] args) { リスト変数=新しいリスト();variable.Add(新しいVars {id = "var1"、name =新しい文字列[] {"n1"、 "n2"、 "n3"、 "n4"}}); Console.WriteLine(variable); Console.Read(); } パブリッククラスVars { 公開ストリングid {get;セット; } パブリックstring [] name {get;セット; } } このスニペットをコピーします。 –

0

名前は文字列です。名前を文字列にすることはできません。これは文字列のリストに変更する必要があります。

オブジェクトを構築するためにプロパティを使用しているため、最初に他の回答で提案されたものを試してみるとnull参照例外が発生しないように、文字列のリストの新しいインスタンスを提供する必要があります。

public void addToObject() 
     { 
      List<Vars> variable = new List<Vars>(); 
      variable.Add(new Vars { Id = "var1", Names = new List<string>() { "n1", "n2", "n3", "n4" } }); 
     } 

    public class Vars 
    { 
     public string Id { get; set; } 
     public List<string> Names { get; set; } 
    } 
を名前にあなたがバールのコンストラクタで名前のインスタンスを作成することにより、変数リストに新しいオブジェクトを追加するたびに初期化することを避けることができます

public void addToObject() 
     { 
      List<Vars> variable = new List<Vars>(); 
      variable.Add(new Vars { Id = "var1", Names = { "n1", "n2", "n3", "n4" } }); 
     } 

    public class Vars 
    { 
     public Vars() 
     { 
      this.Names = new List<string>(); 
     } 
     public string Id { get; set; } 
     public List<string> Names { get; set; } 
    } 
関連する問題