我试图在运行时将一种类型的对象转换为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#?
答案 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;
}