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
, а не решение, которое изменило эти классы.