在将其保存到数据库之前,我想以一种通用的方式将httpcontext name属性添加到我的对象中,我认为我可以使用OnActionExecuting
方法来做到这一点。
我正在使用一个Web API生命周期挂钩OnActionExecuting
。而且我正在尝试将传入的参数强制转换为List<object>
,但它始终失败,并显示错误消息,提示它无法完成任务:
public override void OnActionExecuting(ActionExecutingContext context)
{
if (context.ModelState.IsValid)
{
try
{
var result = context;
var actionParameter = context.ActionArguments["dtoItem"];
List<object> collection = (List<object>)actionParameter;
context.ActionArguments["dtoItem"] = actionParameter;
}
}
catch
{
}
}
}
我为此遇到的错误是:
无法投射类型为
的对象 'System.Collections.Generic.List1[Ctrac.WebApi.Core.Models.TestModel]' to type 'System.Collections.Generic.List
1 [System.Object]'。
答案 0 :(得分:0)
即使List<T1>
扩展了List<T>
,也无法将T1
的类型强制转换为T
。
这是设计使然。
假设编译器允许我们这样做,请考虑以下代码:
List<objects> models = new List<TestModel>(); // suppose we can do this
var o = new {a = 1 };
var index = models.IndexOf(o); // now we can invoke IndexOf(o)
实际上,这里的models
“指向” List<TestModel>
的实例,这意味着调用models.IndexOf(o)
最终将调用List<TestModel>.IndexOf(TestModel o)
的方法而不是{ {1}}。 (类似于polymorphism
)。
List<object>.IndexOf(object o)
换句话说,您假设实例List<object> .IndexOf(object o)
|
|
V
List<TestModel>.IndexOf(TestModel o)
(类型为o
)可以转换为object
。显然,这是不安全的。
请参见Covariance and Contravariance in Generics。
如何修复
只需使用LINQ进行投射:
TestModel