Wie führe ich die explizite operation casting von Reflexion?
Will ich mit Reflexion und entweder eine implizite oder explizite coversion mit der spiegelung.
Gegeben, die ich definiert haben, Foo diese Weise
public class Foo
{
public static explicit operator decimal(Foo foo)
{
return foo.Value;
}
public static explicit operator Foo(decimal number)
{
return new Foo(number);
}
public Foo() { }
public Foo(decimal number)
{
Value = number;
}
public decimal Value { get; set; }
public override string ToString()
{
return Value.ToString();
}
}
Wenn ich diesen code ausführen
decimal someNumber = 42.42m;
var test = (Foo)someNumber;
Console.WriteLine(test); //Writes 42.42 No problems
Wenn ich versuche, eine Klasse zu definieren, die mit Foo als Mitglied geben und reflektion verwenden, um es zu setzen. Ich bekomme die folgende Ausnahme.
Error : Object of type 'System.Decimal' cannot be converted to type 'Foo'.
StackTrace: at System.RuntimeType.TryChangeType(Object value, Binder binder, CultureInfo culture, Boolean needsSpecialCast)
at System.RuntimeType.CheckValue(Object value, Binder binder, CultureInfo culture, BindingFlags invokeAttr)
at System.Reflection.MethodBase.CheckArguments(Object[] parameters, Binder binder, BindingFlags invokeAttr, CultureInfo culture, Signature sig)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at System.Reflection.RuntimePropertyInfo.SetValue(Object obj, Object value, BindingFlags invokeAttr, Binder binder, Object[] index, CultureInfo culture)
at System.Reflection.RuntimePropertyInfo.SetValue(Object obj, Object value, Object[] index)
Hier ist der code, den ich verwenden, um die Eigenschaft der reflektion
public class FooComposite
{
public Foo Bar { get; set; }
}
var properties = typeof(FooComposite).GetProperties();
var testFoo = new FooComposite();
foreach(var propertyInfo in properties)
{
propertyInfo.SetValue(testFoo, 17.17m, null); //Exception generated on this line
}
Console.WriteLine(testFoo.Bar); //Never gets here
Wie kann ich diese Konvertierung?
- Wenn Sie wollen, um dies dynamisch und nicht code der Besetzung, Marc Tat etwas, was sehr nahe an dem, was du suchst über auf MSDN-Foren, die mithilfe von Ausdrücken (Lesen Sie die ganze Diskussion, nicht nur die Antwort). Siehe: social.msdn.microsoft.com/Forums/eu/csharplanguage/thread/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nun, es ist wirklich nicht anders als Ihre nicht-Reflex-code, müssen Sie noch explizit umgewandelt, die Zahl in eine
Foo
:Live-Beispiel: http://rextester.com/rundotnet?code=BPQ74480
Aus Interesse habe ich versucht ein paar alternativen.
implicit
cast inFoo
- funktioniert nicht, gleiche Fehlermeldung LiveConvert.ChangeType(17.17m,typeof(Foo))
- auch nicht funktioniert. LiveSah ich diese Frage heute zu stellen, während Sie versuchen, kopieren Sie Felder, die mit Namen zwischen zwei Objekten. Ich war ziemlich enttäuscht zu sehen, die gewählte Antwort war "Sie kann nur explizit aufgerufen werden, einen expliziten operator." Nach allem, was sonst getan werden kann, durch Reflexion.
Mein problem war ein Spiegelbild-Methode versuchen, um eine Tiefe Kopie zwischen zwei Klassen, weil von einem komplexen Typ. Ich habe versucht, zu definieren, eine
explicit operator
Konvertierung, aber es schien nicht genannt, bekommen, so habe ich herausgefunden, einen Weg, um es durch Reflexion. Mit einigen anderen Forschungseinrichtungen über den Aufruf von statischen Methoden, die ich fand, das funktioniert für mich beim kopieren eines komplexen Typs in pSource in eine andere Eigenschaft pDest. der Typ in pDest hat eine Wandlung von pSource Typ.dstVar ist mein Ziel-Instanz.
pDest ist die aktuelle PropertyInfo in die Ziel-Instanz.
Quelle ist meine Quell-Instanz.
pSource ist die aktuelle PropertyInfo in der Quell-Instanz.
Der Typ, für mein Ziel-Eigenschaft hat, eine explizite Konvertierung aus der Eigenschaft source geben, das funktioniert ohne
Ich benötigte Funktionalität, wie Ted H, aber ich setzte es so:
Edit: ich brauchte eine weiter entwickelte version vor kurzem, und dies ist, was ich kam mit. Beachten Sie, dass es nicht für alle verfügbaren Konvertierungen.
Convert
Klasse undTypeConverter
's.Gebäude auf Herman ' s Antwort... ich erkannte, dass sowohl die Quell-und Ziel-Klasse definieren kann, die conversion operator. So, hier ist meine version:
Typische Verwendung:
Ist Folgendes zu beachten:
out
variable (ähnlich TryParse-Methoden)Danke an alle, die oben für ein toller start für das, was ich brauchte. Ich lieh mir und auch Hinzugefügt. In meiner situation, die ich brauchte, alle der oben genannten und auch gebraucht Suche alle Vorfahren Basis-Typen für die Quell-und Ziel-Typ zu sehen, wenn einer von Ihnen enthalten eine implizite oder explizite Konvertierung zu meinem Ziel-Typen. Das hinzufügen dieser zusätzlichen Bedingung, die ich produziert die unten.