2016-01-08 10 views
5

Um die Suche nach einem Weg zu konvertieren zu umwandeln hält eine System.Reflection.PropertyInfo in seinem ursprünglichen ObjektWie System.Reflection.PropertyInfo Objekt in seinen ursprünglichen Objekttyp

public static Child ConvertToChiildObject(this PropertyInfo propertyInfo) 
    { 
     var p = (Child)propertyInfo; 

    } 

Das Propertyinfo-Objekt actulayy eine Klasse wie folgen

public class Child{ 
    public string name = "S"; 
    public string age = "44"; 

} 

Bisher habe ich versucht, implizites Casting gibt es eine Möglichkeit, dies zu tun?

+0

Die Frage ist mir unklar. Möchten Sie den Wert erhalten, den Ihre 'propertyInfo' hat? oder aber? – Irshad

+3

Sie müssten tun '(Child) propertyInfo.GetValue (obj)' - aber Sie * brauchen * eine Instanz des Objekts mit dieser Eigenschaft – Rob

+0

@Irshad Ich habe meine Frage aktualisiert – Kalanamith

Antwort

2

Versuchen Sie dies.

public static Child ConvertToChiildObject(this PropertyInfo propertyInfo, object parent) 
{ 
    var source = propertyInfo.GetValue(parent, null); 
    var destination = Activator.CreateInstance(propertyInfo.PropertyType) 
    foreach(PropertyInfo prop in destination.GetType().GetProperties().ToList()){ 
     var value = source.GetType().GetProperty(prop.Name).GetValue(source, null); 
     prop.SetValue(destination, value, null); 
    } 
return (Child)destination; 
} 

In der oben verwendeten i zusätzlichen Parameter parent, die Gegenstand der Basis ist Child

+0

Dieser Code funktioniert überhaupt nicht "destination.GetProperties()" sollte es sein.GetTyp(). GetProperties() – Kalanamith

+0

ja kalanamith, es ist ein Tippfehler .. – Madhu

+0

Ich habe diese behoben, Vielen Dank – Kalanamith

5

I Vorwort muss, dass dies auf die Frage keine Antwort, sondern eine Ausbildung excersise.

Wie andere erklärt haben, missverstehen Sie die Verwendung der PropertyInfo Klasse. Diese Klasse wird verwendet, um die Eigenschaft die Eigenschaft und nicht enthalten und zugehörige Daten zu beschreiben. Daher ist das, was Sie versuchen zu tun, nicht ohne zusätzliche Informationen möglich.

Nun ist die PropertyInfo Klasse kann erhalten die Instanz bezogenen Daten von einem Objekt, aber Sie müssen eine Instanz des Objekts müssen die Daten lesen aus.

Nehmen Sie zum Beispiel die folgende Klassenstruktur.

public class Child 
{ 
    public string name = "S"; 
    public string age = "44"; 
} 

public class Parent 
{ 
    public Parent() 
    { 
     Child = new Child(); 
    } 

    public Child Child { get; set; } 
} 

Das Anwesen Child ist eine Eigenschaft der Parent Klasse. Wenn die Elternklasse erstellt wird, wird eine neue Child Instanz als Teil der Parent Instanz erstellt.

Wir können dann Reflection verwenden, um den Wert der Eigenschaft Child durch einfachen Aufruf zu erhalten.

var parent = new Parent(); 
var childProp = typeof(Parent).GetProperty("Child"); 
var childValue = (Child)childProp.GetValue(parent); 

Das funktioniert gut. Der wichtige Teil ist (Child)childProp.GetValue(parent). Beachten Sie, dass wir auf die GetValue(object)-Methode der Klasse PropertyInfo zugreifen, um den Wert der Child-Eigenschaft aus der Instanz der Parent-Klasse abzurufen.

Dies ist fundamental, wie Sie die Methode für den Zugriff auf die Eigenschaft Daten entwerfen müssten. Wie wir jedoch einige Male aufgeführt haben, müssen Sie eine Instanz der Eigenschaft haben. Jetzt können wir eine Erweiterungsmethode schreiben, die diesen Aufruf erleichtert. Wie ich es sehe, gibt es keinen Vorteil, eine Erweiterungsmethode zu verwenden, da die existierende Methode ziemlich schnell zu verwenden ist. Wenn Sie jedoch eine neue Instanz des übergeordneten Objekts erstellen möchten, dann erhalten Sie den Wert könnte eine sehr einfache Erweiterungsmethode schreiben.

public static TPropertyType ConvertToChildObject<TInstanceType, TPropertyType>(this PropertyInfo propertyInfo, TInstanceType instance) 
    where TInstanceType : class, new() 
{ 
    if (instance == null) 
     instance = Activator.CreateInstance<TInstanceType>(); 

    //var p = (Child)propertyInfo; 
    return (TPropertyType)propertyInfo.GetValue(instance); 

} 

Nun akzeptiert diese Erweiterungsmethode einfach eine Instanz als zweiten Parameter (oder erstens im Nebenstellenaufruf).

var parent = new Parent(); 
parent.Child.age = "100"; 
var childValue = childProp.ConvertToChildObject<Parent, Child>(parent); 
var childValueNull = childProp.ConvertToChildObject<Parent, Child>(null); 

Ergebnisse

childValue = name: S, age: 44 
childValueNull = name: S, age: 100 

Hinweis auf die Bedeutung einer Instanz haben.

One Caveat: Die Extension-Methode wird eine neue Instanz des Objekts erstellen, wenn das Objekt durch den Aufruf null ist:

if (instance == null) 
    instance = Activator.CreateInstance<TInstanceType>(); 

Sie bemerken auch die typeparamTInstanceType muss ein class sein und muss bestätigen die new() Einschränkung. Dies bedeutet, dass es eine class sein muss und einen parameterlosen Konstruktor haben muss.

Ich verstehe, dass dies keine Lösung für die Frage ist, aber hoffe, es hilft.

+1

Vielen Dank so viel, ich schätze deine Antwort sehr und es hilft mir sehr! – Kalanamith

Verwandte Themen