2013-12-16 18 views
5

実行時にクラスのメンバー/プロパティを動的に作成および設定する方法を教えてください。実行時にクラスのメンバー/プロパティを動的に作成および設定する

Refが:http://msdn.microsoft.com/en-us/library/system.dynamic.dynamicobject.trygetmember(v=vs.110).aspx

は、私は私の要件に合うようにアイデアを変更しようとしましたが、それを行うことができません。

私は、データベースからKeyValueをフェッチう意味、実行時にクラスのメンバーを設定する必要が午前と私のクラスは、実行時前に定義されていないメンバーと完全に動的になりますが、それらのすべては、実行時にデータベースからフェッチされ。だからここ

は(MSDNから撮影)私のコードを行く:

public class DynamicObjDictionary : DynamicObject 
{ 
    // The inner dictionary. 
    Dictionary<string, object> dictionary = new Dictionary<string, object>(); 
    public int Count 
    { 
     get{return dictionary.Count;} 
    } 

public override bool TryGetMember(GetMemberBinder binder, out object result) 
    { 
     string name = binder.Name.ToLower(); 
     return dynDict.TryGetValue(name, out result); 
    } 

    public override bool TrySetMember(SetMemberBinder binder, object value) 
    { 
     dynDict[binder.Name.ToLower()] = value; 
     return true; 
    } 
} 
} 

クラス

dynamic DynObj = new DynamicObjDictionary(); 
     DataSet ds = new DataSet(); 
     ds = GetObjectProperties() // returns dataset having the properties as key and value pair; 
     if (ds.Tables["PropTable"].Rows.Count > 0) 
     { 
      foreach (DataRow dr in ds.Tables["PropTable"].Rows) 
      { 
       string KeyName = dr["KeyName"].ToString(); 
       string ValueName= dr["ValueName"].ToString(); 
       //---I want that in place of fldName the actual value from dr is added to the class - currently it returns DynObj.KeyName only. 
       DynObj.KeyName = ValueName; 
       // Means if current dr["KeyName"].ToString() has "Property1" 
       // And dr["ValueName"].ToString() has "PropertyValue" 
       // The DynObj should be like DynObj.Property1 = "PropertyValue" 
      } 
     } 

そして、別の問題のメンバー/プロパティを初期化し、定義するコードは、私はすべて欲しいということです上記の初期化の後に設定されるプロパティをハードコードされたクラスオブジェクトのようにアクセスできるようにします。現在のコードは、最後のプロパティ、すなわちデータセットの最後の行の値のみを戻します。

+0

なぜあなたはExpandoObjectを使用していませんか? – MikeSW

+0

このようにすると、後でこれらのプロパティにどのようにアクセスしますか?あなたは* KeyName *を知る必要がありますが、もしあなたがすでにそれを知っているなら、辞書を使うのはなぜですか? –

+0

あなたの値はすべて文字列ですか? – Ben

答えて

7

辞書ベースのAPIを追加するか、既にそれがある実装を使用してください。率直に言ってExpandoObjectは正常に動作し、内蔵のIDictionary<string,object> APIを持っています。

var obj = new ExpandoObject(); 
DataSet ds = GetObjectProperties() // returns dataset having the properties as key and value pair; 
if (ds.Tables["PropTable"].Rows.Count > 0) 
{ 
    foreach (DataRow dr in ds.Tables["PropTable"].Rows) 
    { 
     string KeyName = dr["KeyName"].ToString(); 
     string ValueName= dr["ValueName"].ToString(); 
     obj[KeyName] = ValueName; 
    } 
} 
dynamic DynObj = obj; 
// ... 
+0

上記の答えと提案に感謝します。私は 'ExpandoObject()'を実際に使用して 'Key-Value'ペアを維持し、データを動的に返さなければなりませんでした。 – Cyberpks

+0

@marc:あなたのコードを試しましたが、この行はエラーobj [KeyName] = ValueNameを与えています。私はVS2010を使用しています。助けてください。 – Thomas

+1

@トーマスああ、それは完全に私は '電話でそれを書いた可能性があります!インデクサーにアクセスするには 'obj'を' IDictionary 'にキャストする必要があります –

関連する問題