Ich habe einige Code (der gut arbeitet), die etwa wie folgt aussieht:Wie kann ich mit reflection von int in dezimal konvertieren?
int integer = 42;
decimal? castTo = integer;
Dann wollte ich etwas ähnliches mit Reflexion tun, mit einigen Code, der wie folgt aussieht:
object value = source; // source was an int originally
var parameters = new object[1];
...
parameters[0] = value;
var setMethod = property.GetSetMethod();
// Call the set method, which takes a decimal? as a parameter
setMethod.Invoke(o, parameters);
Wenn Ich tue das, ich bekomme:
Warum würde eine implizite Typumwandlung, die anderswo gut funktioniert, mit Reflektion fehlschlagen? Gibt es einen Trick zur Verwendung der Reflektion, um diese Konvertierung durchzuführen?
bearbeiten: Vielen Dank an Alle für die Antworten. Hier ist die Lösung kam ich mit auf der Grundlage der Antworten:
private object Convert(object source, Type destinationType)
{
if (source == null)
{
return null;
}
var sourceType = source.GetType();
// unwrap nullable types
var nullableType = Nullable.GetUnderlyingType(destinationType);
if(nullableType != null)
{
destinationType = nullableType;
}
nullableType = Nullable.GetUnderlyingType(sourceType);
if(nullableType != null)
{
sourceType = nullableType;
}
var implicitCastMethod =
destinationType.GetMethod("op_Implicit",
new[] { sourceType });
if(implicitCastMethod == null)
{
return null;
}
return implicitCastMethod.Invoke(null, new[] { source });
}
Edit # 2: Ich wünschte, jemand System.Convert.ChangeType()
erwähnt hatte, die diese Fälle behandelt und mehr. Es stellt sich heraus, dass op_Implicit
nur zu weniger restriktiven numerischen Typen konvertieren kann. (natürlich, daher das "Implizite" im Namen). Mit anderen Worten arbeitete die erste Lösung für int
→ decimal?
aber nicht decimal?
→ int
. (Es scheint, dass ich brauchen würde diesen Code zu ändern, auch op_Explicit
versuchen, wenn die implizite Umwandlung fehlgeschlagen ist, wenn ich von decimal?
zurück zu int
eine Umwandlung zu handhaben zu können wollte.)
Da System.Convert.ChangeType()
funktioniert nicht mit Nullable<>
Typen, ich endete schließlich einen Code ähnlich wie mit, was ich here gefunden (leicht modifiziert):
private static object Convert(object source, Type destinationType)
{
if(destinationType == null)
{
throw new ArgumentNullException("destinationType");
}
if(destinationType.IsGenericType &&
destinationType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
{
if (source == null)
{
return null;
}
destinationType = Nullable.GetUnderlyingType(destinationType);
}
return System.Convert.ChangeType(source, destinationType);
}
Dies ist im Wesentlichen, was für mich arbeitete. Zumindest hat es mich auf die richtige Spur gebracht. Vielen Dank! – mpontillo
'MethodInfo method = source.GetType(). GetMethod (" op_Implicit ");' ist einfacher zu lesen als die explizit geloopte Suche. –
@Merlyn, yeah, du wirst bemerken, dass ich das gemacht habe, wenn du meine erste Bearbeitung gelesen hast, außer dass ich den Typ auch in den GetMethod() - Aufruf eingefügt habe. Sonst, wenn es mehrere überladene op_Implicit-Methoden gäbe, müsste ich noch eine Schleife machen? – mpontillo