Приведение типов C # во время выполнения для Array.SetValue

I ' m пытается создать массив с помощью отражения и вставить в него значения. Я пытаюсь сделать это для многих разных типов, поэтому мне нужна функция createAndFillArray , способная на это:

String propertyName1 = "prop1";
String propertyName2 = "prop2";

Type t1 = typeof(myType).getProperty(propertyName1).PropertyType.getElementType();
Type t2 = typeof(myType).getProperty(propertyName2).PropertyType.getElementType();

double exampleA = 22.5;
int exampleB = 43;

Array arrA = createAndFillArray(t1, exampleA);
Array arrB = createAndFillArray(t2, exampleB);

private Array createAndFillArray(Type t, object val){
    Array arr = Array.CreateInstance( t, 1); //length 1 in this example only, real-world is of variable length.
    arr.SetValue( val, 0 ); //this causes the following error: "System.InvalidCastException : Object cannot be stored in an array of this type."
    return arr;
}

с классом A следующим образом:

public class A{
    public A(){}

    private double val;
    public double Value{
        get{ return val; }
        set{ this.val = value; }
    }

    public static implicit operator A(double d){
        A a = new A();
        a.Value = d;
        return a;
    }
}

и класс B очень похожи, но с int :

public class B{
    public B(){}

    private double val;
    public double Value{
        get{ return val; }
        set{ this.val = value; }
    }

    public static implicit operator B(double d){
        B b = new B();
        b.Value = d;
        return b;
    }
}

и myType выглядят примерно так:

public class myType{
    public A prop1{ get; set; }
    public B prop2{ get; set; }
}

Я надеялся, что неявный оператор обеспечит преобразование double в класс A или int в класс B, и ошибка избегали; но это, очевидно, не так.

Вышеупомянутое используется в настраиваемом классе десериализации, который берет данные из настраиваемого формата данных и заполняет соответствующие свойства объекта .Net. Я делаю это через рефлексию и во время выполнения, поэтому я думаю, что и то и другое неизбежно. Я нацелен на платформу C # 2.0.

У меня десятки, если не сотни, классов, подобных A и B , поэтому предпочел бы найти решение, которое улучшило бы метод createAndFillArray , а не решение, которое изменило эти классы.

]
5
задан Cody Gray 1 January 2011 в 07:48
поделиться