2013-08-17 13 views
5

私はC#でのリフレクションについて少し研究しており、キー付き辞書を使用しているかどうかを知りたいと思っています。辞書内の各キーの値と、その辞書のキー値。C#Reflectionで辞書から動的オブジェクトを生成

私は逆を行い、辞書からオブジェクトを抽出するメソッドを持っています。この辞書には、キーとクラスのプロパティとその値、プロパティの値が含まれています。

可能であれば、これをどうやって行うのだろうと思います。

以下

オブジェクトの辞書を抽出し、私の方法で、次のとおりです。

protected Dictionary<String, String> getObjectProperty(object objeto) 
{ 
    Dictionary<String, String> dictionary = new Dictionary<String, String>(); 

    Type type = objeto.GetType(); 
    FieldInfo[] field = type.GetFields(); 
    PropertyInfo[] myPropertyInfo = type.GetProperties(); 

    String value = null; 

    foreach (var propertyInfo in myPropertyInfo) 
    { 
     if (propertyInfo.GetIndexParameters().Length == 0) 
     { 
      value = (string)propertyInfo.GetValue(objeto, null); 
      value = value == null ? null : value; 
      dictionary.Add(propertyInfo.Name.ToString(), value); 
     } 
    } 

    return dictionary; 
} 
+2

あなたは '動的' 型指定されたオブジェクトを意味していますか?または新しいタイプを作成しますか? – Euphoric

+0

使用している.NET Frameworkのバージョンは? –

+0

オブジェクトは既に存在します。この関数を終了するときには、その結果を既存のオブジェクトにキャスト(myObject)する必要があります。 .NET 4.0 –

答えて

2

私は、これはあなたが探しているものであるかどうかわからないけど、あなたの質問から判断すると、私はあなたが にしたいと思います実行時に、キーを提供することによって得られる辞書にある型から型をインスタンス化する。

これがそうであれば、キーとなる文字列のキーと値のペアを保持する次のクラスを作成し、インスタンス化される値を表すTypesを作成できます。

class DictionaryActivator 
{ 
    Dictionary<string, Type> Dictionary = new Dictionary<string, Type>(); 

    public DictionaryActivator() 
    { 
     Dictionary.Add("MyCar", typeof(Car)); 
     Dictionary.Add("MyHouse", typeof(House)); 
     Dictionary.Add("MyFruit", typeof(Fruit)); 
     Dictionary.Add("MyComputer", typeof(Computer)); 
    } 

    public T GetInstance<T>(string type, params object[] parameters) 
    { 
     if (parameters.Count() == 0) 
     { 
      return (T)Activator.CreateInstance(Dictionary[type]); 
     } 
     else 
     { 
      return (T)Activator.CreateInstance(Dictionary[type], parameters.ToArray()); 
     } 
    } 
} 

この設定をテストするために4つのテストクラスを作成することもできます。これが完了すると

class House 
{ 
    public int Number = 25; 
} 

class Car 
{ 
    public double Price = 50000; 
} 

class Fruit 
{ 
    public string Name = "Apple"; 
} 

class Computer 
{ 
    public string Cpu { get; set; } 
    public string Gpu { get; set; } 

    public Computer(string cpu, string gpu) 
    { 
     Cpu = cpu; 
     Gpu = gpu; 
    } 
} 

、あなたは、辞書からすべてのタイプを取得し、それらをインスタンス化し、適切なタイプにそれらをキャストするために次のコード行を実行することができます。最後にコンピュータの例では、複数のパラメータ(この場合は2つ)を新しく作成したインスタンスに追加し、タイプオブジェクトのインスタンスとして返す方法を示しています。

最後にコンピュータタイプにキャストして、コンストラクタパラメータが実際に対応するプロパティに移動したことを確認できます。すでに辞書を持っていれば、私は反射を避けるために、ちょうど例えばDynamicObject

を使用したい

class Program 
{ 
    static void Main() 
    { 
     var source = new DictionaryActivator(); 

     Console.WriteLine(source.GetInstance<Car>("MyCar").Price); 
     Console.WriteLine(source.GetInstance<House>("MyHouse").Number); 
     Console.WriteLine(source.GetInstance<Fruit>("MyFruit").Name); 

     var computer = source.GetInstance<object>("MyComputer", "Fast CPU", "Fast GPU"); 

     Console.WriteLine((computer as Computer).Cpu); 
     Console.WriteLine((computer as Computer).Gpu); 

     Console.Read(); 
    } 
} 
+0

私は、Object型のオブジェクトを作成し、例えば、2を追加することができますそれらの値を変数に代入して返しますか? –

+0

私は私の答えを編集しました。はい、あなたはそれを正確に行うことができます。 GetInstance (string、params object [])メソッドで定義されたジェネリック型を使用して、新しいインスタンスに必要な数だけパラメータを渡してオブジェクトにキャストします。 –

11

次のように使用することができます
public class DynamicDictionary : DynamicObject 
{ 
    private readonly Dictionary<string, object> dictionary; 

    public DynamicDictionary(Dictionary<string, object> dictionary) 
    { 
     this.dictionary = dictionary; 
    } 

    public override bool TryGetMember(
     GetMemberBinder binder, out object result) 
    { 
     return dictionary.TryGetValue(binder.Name, out result); 
    } 

    public override bool TrySetMember(
     SetMemberBinder binder, object value) 
    { 
     dictionary[binder.Name] = value; 

     return true; 
    } 
} 

dynamic x = new DynamicDictionary(
    new Dictionary<string, object> {{"Name", "Peter"}}); 

Console.WriteLine(x.Name); 
1

ExpandoObjectは辞書ですので、この拡張機能を使用できます:

public static object With(this IDictionary<string, object> obj, IDictionary<string,object> additionalProperties) 
{ 
    foreach (var name in additionalProperties.Keys) 
    obj[name] = additionalProperties[name]; 
    return obj; 
} 

使用法:

var dynamicObj = new System.Dynamic.ExpandoObject().With(myDictionary); 
関連する問題