2016-06-03 17 views
0

ich eine wirklich große Sammlung von POCO müssen stringfy Objekte mit mehreren Unter Eigenschaften, die ich verspotten müssen ...Wie ein POCO Objekt

Während Schnell Uhr verwenden, sehe ich die Einheit, wie ich es wollte werden ...

Was ich suche ist sozusagen eine Erweiterung Verfahren oder ein Weg, es stringfy so dass ich zu meiner Einheit Test gehen und verspotten ihn dort ... Art:

var myPoco = new Poco { 
         //here goes whatever i get from my magic method 
         }; 

Kann ich alle Eigenschaftennamen und -werte eines bestimmten Objekts so anordnen, dass es zuweisbar ist?

EDIT 1:
Ich bin auf der Suche nach so etwas wie:

public static string StringFy(this object obj, string prefix) 
    { 
     string result = ""; 
     obj.GetType().GetProperties().ToList().ForEach(i => 
     { 
      result += prefix + "." + i.Name + " = "; 
      if (i.PropertyType == typeof(string)) 
      { 
       result += "\"" + i.GetValue(obj) + "\";\r\n"; 
      } 
      else 
      if (i.PropertyType == typeof(Guid)) 
      { 
       result += "new Guid(\"" + i.GetValue(obj) + "\");\r\n"; 
      } 
      else 
      { 
       var objAux = i.GetValue(obj); 
       result += (objAux == null ? "null" : objAux) + ";\r\n"; 
      } 
     }); 
     return result.Replace(" = True;", " = true;").Replace(" = False;", " = false;"); 
    } 
+0

Ich habe das noch nie wirklich getan, also werde ich es als Kommentar hinterlassen, anstatt eine Antwort, aber ich denke, Sie könnten einen Indexer auf Ihrer Klasse erstellen, die Reflexion verwendet Eigenschaften über Zeichenfolge zu setzen Wert des Eigenschaftsnamens. Suchen Sie nach Reflektionen, um Werte nach Eigenschaftsnamen zu setzen, und suchen Sie nach Indexern, wenn Sie nicht mit dem, was ich dort rede, vertraut sind. – Jakotheshadows

Antwort

0

Sie könnten einen Indexer auf Ihrer Klasse erstellen, die Reflexionseigenschaften über String-Wert des Eigenschaftsnamen setzen verwendet. Hier ist eine Beispielklasse:

using System.Reflection; 

namespace ReflectionAndIndexers 
{ 
    class ReflectionIndexer 
    { 
     public string StrProp1 { get; set; } 
     public string StrProp2 { get; set; } 
     public int IntProp1 { get; set; } 
     public int IntProp2 { get; set; } 

     public object this[string s] 
     { 
      set 
      { 
       PropertyInfo prop = this.GetType().GetProperty(s, BindingFlags.Public | BindingFlags.Instance); 
       if(prop != null && prop.CanWrite) 
       { 
        prop.SetValue(this, value, null); 
       } 
      } 
     } 
    } 
} 

und dann testen:

using System; 

namespace ReflectionAndIndexers 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var ri = new ReflectionIndexer(); 
      ri["StrProp1"] = "test1"; 
      ri["StrProp2"] = "test2"; 
      ri["IntProp1"] = 1; 
      ri["IntProp2"] = 2; 

      Console.WriteLine(ri.StrProp1); 
      Console.WriteLine(ri.StrProp2); 
      Console.WriteLine(ri.IntProp1); 
      Console.WriteLine(ri.IntProp2); 
      Console.ReadLine(); 
     } 
    } 
} 

Ausgang:

test1

test2

+0

Warum muss ich Reflection verwenden, wenn ich direkt 'ri.StrProp1 =" test1 ";' kann mir hier etwas Kontext fehlt !! – techspider

+0

Ich möchte andersherum ... ein Objekt geben, eine Zeichenfolge extrahieren, die es mir erlaubt, es wieder aufzufüllen – Leonardo

+0

@Leonardo Ich habe Probleme zu verstehen, was Sie fragen, denke ich. Zeigen Sie einen "falschen" Code, der zeigt, was Sie vielleicht gerade versuchen? – Jakotheshadows