簡體   English   中英

在運行時將對象數組轉換為T類型的通用數組typeof

[英]Conversion of object array to Generic array typeof T Type at runtime C#

我試圖在運行時將對象類型轉換為T類型,但是我花了很多時間。 調用create方法並應該對字典執行一些魔術操作-為函數提供T [],DbContext和所請求的Type作為System.Type-但是,我通過intellisense從Visual Studio中收到以下錯誤,當我嘗試時編譯。 錯誤代表'System.Func'有一些無效的參數。

編輯2-16-2016

我不明白無效參數是什么-因為我在DbContrext中傳遞了System.Type和通用T []-如果我從字典函數中刪除System.Type參數並將其保留為參數T [],則傳遞在對象工作正常! 所以我的假設是它與傳遞System.Type或某些params語句如何有關-但我不知道-請參閱我微弱的嘗試進行轉換的代碼,並請參閱底部的一部分內容研究工作。

有誰知道我可以使用上述字典函數的方式嗎?無需使用對Create方法的泛型調用,換句話說,我不能傳入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日對於向下投票者的推動-單擊不需要太多的努力,但是需要禮貌地進行評論-我嘗試過一些鏈接:

如何將對象數組轉換為泛型類型數組

將Type數組轉換為Generic數組?

如何在C#中將對象數組轉換為另一種類型的對象數組?

我確實找到了解決方案,但花了幾個步驟解決了問題。

雖然我確實知道錯誤是關於[顯然是從錯誤消息中]提供的參數,但是我傳入的對象沒有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;

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM