2013-08-17 18 views
5

C# 'daki yansımalar hakkında biraz araştırma yapıyorum ve anahtar-değerlerle bir sözlük kullanıp kullanmadığımı öğrenmek istiyorum. sözlükteki her anahtarın ve değerlerinin, bu sözlüğün anahtar değeri.C# Reflection ile sözlükten dinamik nesne üretin

Aksini yapan, bir nesneyi bir sözlükten ayıklayan bir yönteme sahibim; bu sözlük, anahtarları ve sınıf özelliklerini ve değerlerini, özelliklerin değerini içerir.

Mümkünse bunu nasıl yapacağımı merak ediyorum. Aşağıda

bir nesnenin bir sözlük ayıklar benim yöntemdir: Bu aradığınız ama sorunuzun bakılırsa şeyin ise

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

sen 'dinamik' daktilo nesneyi ifade ediyor mu? Ya da yeni tip oluştur? – Euphoric

+0

Hangi .NET framework sürümünü kullanıyorsunuz? –

+0

Nesne zaten var, bu işlevin çıkışında, sadece (myObject) sonucunu varolan nesneye dökmem gerekiyor. .NET 4.0 –

cevap

2

Emin değilim, sana istiyorum düşünüyorum Bir anahtarın sağlanmasıyla elde edilecek olan bir sözlükte bulunan türlerden çalışma zamanında türlerini başlatır.

Eğer öyleyse, anahtarlarınız olacak anahtar/değer çiftlerini ve örneklenecek olan değerleri temsil edecek olan Türleri tutacak aşağıdaki sınıfı oluşturabilirsiniz. Bu kurulumu sınamak için dört test sınıfı da oluşturabilirsiniz. Bu yapıldıktan sonra

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; 
    } 
} 

, sen sözlükten her türlü almak onları örneğini ve uygun türleri için bunları atmak aşağıdaki kod satırlarını çalıştırabilir. Dikkat edebileceğiniz gibi, son Bilgisayar örneği, yeni oluşturulan örneğe birden çok parametre (bu örnekte iki) nasıl eklendiğini gösterir ve nesnesinin nesnesinin bir örneği olarak döndürür.

Sonunda, Bilgisayar türüne atayabilir, böylece yapıcı parametrelerinin gerçekte ilgili özelliklere gittiğini kontrol edebilirsiniz. Zaten bir sözlük var ise

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

I nesne türü bir nesne oluşturabilir ve ekleme örneğin iki değişkenleri kendi değerleriyle karşılaştırır ve geri verir mi? –

+0

Cevabımı düzenledim evet, tam olarak bunu yapabilirsin. Yeni örneğinize istediğiniz sayıda parametre iletin ve GetInstance (string, params object []) yönteminde tanımlanan jenerik türünü kullanarak bir nesneye dönüştürün. –

11

, ben yansımayı önlemek ve sadece Örneğin DynamicObject

kullanmak: olarak kullanılabilir

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; 
    } 
} 

aşağıdaki gibidir:

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

Console.WriteLine(x.Name); 
1

ExpandoObject bir sözlük bu yana, bu uzantı işlevini kullanabilirsiniz:

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; 
} 

Kullanımı:

var dynamicObj = new System.Dynamic.ExpandoObject().With(myDictionary);