Я пытаюсь создать массив с помощью отражения и вставить в него значения. Я пытаюсь сделать это для многих различных типов, поэтому хотел бы функцию 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;
}
с классом А следующим образом:
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
, а не решение, которое изменило бы эти классы.