在运行时 C# 将对象数组转换为 T 类型的泛型数组类型

本文关键字:类型 数组 运行时 泛型 转换 对象 | 更新日期: 2023-09-27 18:34:53

>我正在尝试在运行时将一种类型的对象转换为一种T类型,但我有相当长的时间。 创建方法被调用,并且应该在字典上执行一些魔术 - 为函数提供T[],DbContext和请求的类型作为System.Type - 但是我通过智能感知从Visual Studio收到以下错误,当我尝试编译时。错误委托 'System.Func' 有一些无效的参数。

编辑 2016-2-16

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

有没有人知道我可以使用上面的字典函数的方法 - 换句话说,我不能在 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;
}

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

如何将对象数组强制转换为泛型类型数组

将类型数组转换为泛型数组?

如何在 C# 中将对象数组向上转换为其他类型的对象数组?

在运行时 C# 将对象数组转换为 T 类型的泛型数组类型

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

虽然我确实知道错误是关于我的参数被提供的[显然 - 来自错误消息],但我在没有Syste.Type参数的情况下传入对象并且它起作用的事实让我失望。在字典函数中添加了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;
}