2017-03-15 9 views
-1

私はクラスオブジェクトを持つリストを持っています。私は最初からそのクラスにプロパティを直接実装することなく、後でプロパティを追加する方法を知りたいと思います。私は同じようExampleのリストを持っているリスト内のクラスオブジェクトにプロパティを追加する

public class Example{ 

    public int ExampleInt {get; set;} 
    public string ExampleString {get; set;} 
    public double ExampleDouble {get; set;} 
} 

:今List<Example>

、どのように私は追加することができ、Exampleクラスに直接実装せず、そのList<Example>内のすべてのオブジェクトに、ExampleBoolプロパティを言うことができますか?

+3

downvoteの場合、私は今後の質問を改善する理由を知りたいと思います。 – ipid

+1

まあ、理由1:このコードはコンパイルされません。 – Sinatr

答えて

5

C#は静的型付き言語です。クラスメンバーを動的に追加または削除することはできません。代わりに静的に型付けされたクラスの動的オブジェクトを使用すると便利かもしれませんいくつかのケースでは

var examples = new List<Example>(); 
var result = from e in examples 
      select new { 
       e.ExampleInt, 
       e.ExampleString, 
       e.ExampleDouble, 
       ExampleBoolean = true 
      }; 

:しかし、あなたはあなたが好きな性質を持つことになり、新たな匿名クラスを作成することができます。 ExpandoObjectを見てください。実行時にメンバーを動的に追加したり削除したりすることができます。しかし、あなたはパフォーマンスが低下します、インテリセンスを失うことになる、とあなたは最初から各オブジェクトを作成する必要があります:

var examples = new List<dynamic> 
{ 
    new ExpandoObject(), // initially it does not have any properties 
    new ExpandoObject() 
}; 

for (int i = 0; i < examples.Count; i++) 
{ 
    examples[i].ExampleInt = i; 
    // etc 
} 

for (int i = 0; i < examples.Count; i++) // we add new property 
    examples[i].ExampleBoolean = i % 2 == 0; 

foreach(var example in examples) 
    Console.WriteLine($"{example.ExampleInt} {example.ExampleBoolean}"); 
+0

私は、ありがとう!プロパティが多すぎるクラスがある場合、宣言を短縮する方法はありますか?次のコードは明らかに動作しませんが、 "... select new {e.Example、ExampleBoolean = true};'? – ipid

+1

@ipidでも動作します - 'Example'オブジェクト全体に' Example'プロパティがありますしかし、あなたはメソッド間で匿名のオブジェクトを渡すことはできません。そうする必要がある場合は、新しい名前付きクラスを作成する必要があります。また、異なるクラス間のマッピングを簡略化するAutoMapper –

0

、それは標準的な方法で可能ではないですが、あなたはまた、相続

public class ExampleWithBool { public bool ExampleBoolean {get; set;}} 

を作成することができます匿名のクラス(Sergeyの答えを参照)。

関連する問題