在OnActionExecuting中将对象转换为List <object>

时间:2018-12-13 13:45:52

标签: c# asp.net-core asp.net-core-webapi

在将其保存到数据库之前,我想以一种通用的方式将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.List 1[Ctrac.WebApi.Core.Models.TestModel]' to type 'System.Collections.Generic.List 1 [System.Object]'。

1 个答案:

答案 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