2011-01-19 13 views
4

既存のオブジェクトを拡張することは可能ですか?C#動的にオブジェクトを拡張する

私はコード

var record = new 
{ 
    id, 
    name 
}; 

を持っており、

var list = new List<object>(){ object1, object2 }; 

iは、後でオブジェクトに追加でき匿名オブジェクトのリストを持っていますか?いや、要するに

var record = new 
{ 
    id, 
    name, 
    object1, 
    object2 
}; 
+2

※レコード*コレクションと*オブジェクト1オブジェクト2 *はアイテムですか?または* object1 *は* record *のプロパティですか? –

+0

レコードはコレクションであり、object1は記録する新しいプロパティとして追加する他のオブジェクトです – Marco

+0

@Marco - プロパティは* named *です。リストの項目は*ではありません* ... –

答えて

2

を結果として私はこれを取得します

foreach (var o in list) 
{ 
    record.add(o); 
} 

として何かのように 。少なくとも、匿名のタイプではありません。ここには2つのアプローチがあります。 dynamicはあなたが望むものを与えるかもしれませんが、結合するのは面倒です。それ以外には、基本的な財産バッグ - 単にDictionary<string,object>でもされます。 プロパティリストを(それぞれが主に匿名で)結合しようとしている中で、

obj.id 

はしかし、より根本的な問題があります

obj["id"] 

次のようになります。唯一の違いは、ということで単一のステップであなたこれを行うfor data-binding purpose via custom property modelsしかし、それはトリッキーです。

+3

asp.netのViewStateとSessionオブジェクトはプロパティバッグアプローチの古典的な例です。何かが入り込み、何かが出てくる可能性があり、畳み込まれた構文は必要ありません。 – SWeko

0

.net4以降、ExpandoObjectを使ってそのようなことを行うことができます。例えば

:あなたは何ができるか

 var objs = new List<ExpandoObject>(); 

     for (var i = 0; i < 10; i++) 
     { 
      dynamic eObj = new ExpandoObject(); 
      eObj.Property = i; 
      objs.Add(eObj); 
     } 

     foreach (dynamic obj in objs) 
     { 
      obj.Property2 = "bubuValue" + obj.Property; 
      obj.Property3 = "bubuValue" + obj.Property2; 
     } 

     foreach (dynamic obj in objs) 
     { 
      Console.WriteLine(obj.Property3); 
     } 
+0

最後の 'obj i objs'のProperty2/Property3だけを保持することに注意してください。 –

1

は、クラス拡張を作成することです。実行時に新しいメソッドを追加することはできませんが、あなたはこのような何かを行うことができます:あなたは、このクラスの動作を拡張したい場合、あなたは拡張クラスを書くことができ

public class OneClass 
{ 
    private List<object> items; 
    public List<object> Items { get { return items; } } 
    public void AddOne(object item) 
    { 
    items.Add(item); 
    } 
} 

public static class OneClassExtensions 
{ 
    public void AddMany(this OneClass self, params object[] items) 
    { 
    foreach(object item in items) 
    { 
     self.Items.Add(item); 
    } 
    } 
} 

あなたOneClassオブジェクトからこの拡張メソッドを呼び出すことができますこの方法:このよう

OneClass obj = new OneClass(); 
obj.AddOne("hello"); 
obj.AddMany("Hello", "world"); // Extension method 

従うべきいくつかのルールがあります。

  1. が拡張クラスは `持っている必要がありますstatic '修飾子
  2. 最初の引数の前に `this'プレフィックスを付ける必要があります。この引数はオブジェクトそのものです。
  3. この拡張クラスをコードで使用するには、使用するすべての.csファイルで `Some.Namespace.That.Has.An.Extensionを使う 'のように、その拡張クラスを含む名前空間を使用する必要があります拡張メソッド。
関連する問題