如何在通用函数中强制转换System.Array以键入T.

时间:2017-09-19 18:59:05

标签: c# arrays casting

所以我得到了这个方法:

private static T ParseXmlToArray<T>(XElement elem)
    {
        /* Setup the array with proper length */
        var elemType = typeof(T).GetElementType();
        var size = elem.GetCollectionLength();
        var arr = Array.CreateInstance(elemType, size);
        var index = 0;

        /* Deserialize each item and add them to array */
        foreach (var item in elem.Elements())
        {
            Type type;
            if (item.TryGetType(out type))
            {
                var parameters = new object[] {item};
                var result = typeof(Serializer).GenericMethodCall("ParseXmlToObjects", type, parameters);
                arr.SetValue(Convert.ChangeType(result, type), index++);
            }
        }

        //TODO: Cast array to T 

        return (T) arr; //Not allowed
        return (T)(object) arr //Allowed and works

        return  default(T);
    }

我正在尝试将System.Array arr转换为T,C#不允许我直接执行。然而,如果我首先将它投射到一个物体然后再投射到T它是允许的并且工作正常。我还没弄清楚原因。谁能告诉我为什么?还有什么方法可以做得更干净吗?

0 个答案:

没有答案