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 typeparam
TInstanceType
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.
Die Frage ist mir unklar. Möchten Sie den Wert erhalten, den Ihre 'propertyInfo' hat? oder aber? – Irshad
Sie müssten tun '(Child) propertyInfo.GetValue (obj)' - aber Sie * brauchen * eine Instanz des Objekts mit dieser Eigenschaft – Rob
@Irshad Ich habe meine Frage aktualisiert – Kalanamith