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?

Schreibe einen Kommentar