在运行时C#将对象数组转换为通用数组类型T Type

时间:2016-02-15 22:48:25

标签: c# arrays generics type-conversion

我试图在运行时将一种类型的对象转换为T类型,但我有相当长的时间使用它。 create方法被调用,并且应该在字典上执行一些魔法 - 提供函数T [],DbContext和请求的Type作为System.Type - 但是我通过intellisense从Visual Studio收到以下错误,当我尝试编译。 错误代表' System.Func'有一些无效的论点。

编辑2-16-2016

我不明白无效参数是什么 - 因为我在DbContrext中传入System.Type和泛型T [] - 如果我从字典函数中删除System.Type参数并将其保留为params T [ ] - 传入对象工作得很好!所以我的假设是它与传递System.Type或某些params语句有关 - 但是我不知道 - 看看我的微弱转换代码以及非常小的底部我研究工作的一部分。

有没有人知道我可以使用上面的字典功能的方法 - 没有使用创建方法的通用调用,换句话说我不能传递T [],也不能将其作为Create传递;它必须是方法签名的形式(只要在方法签名中没有使用泛型,变量就可以了)。

以下代码:

    private Dictionary<Operator, Func<T[], DbContext, System.Type, bool> > operators =
    new Dictionary<Operator, Func<T[], DbContext, System.Type, bool> >
    {   
    { Operator.Update, ( a , b, c ) => {// do work with abc} }

    } 


public bool Create(DbContext context, Operator op, System.Type requestedType, params object[] items )
{

    Type temp = requestedType.MakeArrayType();

    var elementsArray =  Activator.CreateInstance(temp);

    ArrayList elList = new ArrayList(items);
    for (int i = 0; i < elList.Count; i++)
    {
        Convert.ChangeType(elList[i], requestedType);
    }

    elementsArray = elList.ToArray();

    var listType = typeof(object);
    var constructedListType = listType.MakeGenericType(requestedType);

// Error Delegate 'System.Func<T[],System.Data.Entity.DbContext,System.Type,bool>' has some invalid arguments   

    return operators.ContainsKey(op) ? operators[op](items, context, requestedType) : false;

}

编辑2-16-2016 对于downvoters的驱动 - 点击下来需要很少的努力,但需要礼貌评论 - 我试过的一些链接:

How to cast object array to generic type array

Casting Type array to Generic array?

how to upcast object array to another type of object array in C#?

1 个答案:

答案 0 :(得分:0)

我确实找到了解决方案,但我花了几个步骤来解决问题。

虽然我确实知道错误是关于我提供的参数[显然 - 来自错误消息],但是我在没有Syste.Type参数的情况下传入对象并且它工作的事实让我失望。在Dictionary函数中添加了Type的附加参数'C'后,它退出工作并抛出此错误 - 所以你可以想象我认为它是System.Type argC。下面的代码展示了我为了编译它所做的工作,它还没有完全测试但是已经编译了所以我更进了一步:

public bool Create(DbContext context, Operator op, System.Type requestedType, params object[] items)
{
    T[] itemsArray = (T[])new Object[items.Length];

    itemsArray = items.Select(eachObject => (T)eachObject).ToArray();

    return operators.ContainsKey(op) ? operators[op](itemsArray, context, requestedType) : false;

}