Приведение объекта в список <object>в OnActionExecuting - PullRequest
0 голосов
/ 13 декабря 2018

Я хотел бы добавить свойство имени httpcontext общим способом к моим объектам, прежде чем сохранить его в базе данных, и я подумал, что для этого можно использовать метод OnActionExecuting.

Яиспользуя один из хуков жизненного цикла веб-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 голосов
/ 14 декабря 2018

Вы просто не можете разыграть тип от 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) вместо List<object>.IndexOf(object o).(Аналогично polymorphism).

List<object>    .IndexOf(object o)
                           |
                           |
                           V
List<TestModel>.IndexOf(TestModel o)

Другими словами, вы предполагаете, что экземпляр o (тип которого object) можно преобразовать в TestModel.Очевидно, это небезопасно.

См. Ковариация и Контравариантность в Обобщениях .

Как исправить

Просто используйте LINQ дляВ ролях:

List<object> collection = actionParameter
         .Select( m => (object) m)
         .ToList();
...