铸造类型,我不知道它是什么

时间:2017-05-02 08:03:51

标签: c# arrays reflection

让我说我有这样的属性列表:

Type ArrayType
String Value 

我还有另一个这样的清单:

ArrayType=System.Int32
Value=44
Index=0

ArrayType=System.Int32
Value=11
Index=3

ArrayType=System.Int32
Value=7
Index=2

ArrayType=System.Int32
Value=5
Index=1

所有值都是字符串! 我不知道它是什么类型,int32只是一个例子。还会有花车,琴弦等。

所以...我正在创建一个新的类型数组,我从#34; ArrayType"属性

dynamic newArray = Array.CreateInstance(typeOfArray, arraySize);

我知道coure的arraySize

并且正确创建了数组。 但现在我想将所有值(以字符串形式)复制到我的新数组: 但我不知道如何施展它。我尝试过这样的事情:

newArray.SetValue(element.Property.Value,element.Index);

它抛出了一个异常,即他无法将OBJECT写入我的int数组

所以我试图以某种方式投射:

 newArray[element.Index] = Convert.ChangeType(element.Property.Value,element.Property.Type); 

但它仍然无法施放对象

有人可以帮忙:)?

2 个答案:

答案 0 :(得分:0)

我刚刚编写了这个代码示例:

var types = new[] { typeof(int), typeof(float), typeof(double) };
var elements = Enumerable.Range(1, 100)
                       .Select((value, index) => new Element(types[index % types.Length], value.ToString(), index));

var integers = elements.Where(element => element.ArrayType == typeof(int));
var array = Array.CreateInstance(typeof(int), 100);

Console.WriteLine(array.GetType());

foreach(var element in integers)
{
    var value = Convert.ChangeType(element.Value, element.ArrayType);
    array.SetValue(value, element.Index);
}

foreach(var value in array)
{
    Console.WriteLine(value + " " + value.GetType());
}

元素类:

public class Element
{
    public Type ArrayType { get; private set; }
    public string Value { get; private set; }
    public int Index { get; private set; }

    public Element(Type type, string value, int index)
    {
        ArrayType = type;
        Value = value;
        Index = index;
    }
}

Which just works

答案 1 :(得分:0)

好的,现在一切正常:D感谢您的帮助!

   foreach (var element in groupedElement)
                {
                    var newInstance = Activator.CreateInstance(element.Property.Type);

                    newInstance = element.Property.Value;

                    newArray.SetValue(Convert.ChangeType(newInstance, element.Property.Type, CultureInfo.InvariantCulture), element.Index);
                }