无法创建type的实例。类型是接口或抽象类,无法实例化

时间:2019-01-28 09:41:35

标签: c# asp.net rest asp.net-web-api automapper

我了解以下解决方案可以正常工作,但是似乎无法用于收集。如果我尝试在构造函数中将System.Collections.Generic.IList<Something>分配给System.Collections.Generic.IList<ISomething>,则会得到“无法将类型IList<Something>隐式转换为IList<ISomething>。存在显式转换(您是否需要强制转换吗?”) 。有什么建议吗?

工作代码:

public class Foo
{ 
    public int Number { get; private set; }

    public ISomething IsSomething { get; private set; }

    public Foo(int number, Something concreteType)
    {
        Number = number;
        IsSomething = concreteType;
    }
}

不起作用:

public class Foo
{ 
    public int Number { get; private set; }

    public IList<ISomething> IsSomething { get; private set; }

    public Foo(int number, IList<Something> concreteType)
    {
        Number = number;
        IsSomething = concreteType; //getting error
    }
}

ConvertAll似乎已解决此问题。

1 个答案:

答案 0 :(得分:1)

正如@HimBromBeere所指出的那样,如果允许您尝试使用,则这些列表将变为不同的类型并破坏类型的安全性。您可以在这里参考JonSkeet的出色答案:Cast List<T> to List<Interface>

要使代码正常工作,您必须按照JonSkeet的回答中所述进行转换,或者也可以使用ConvertAll方法。

public class Foo
{ 
  public int Number { get; private set; }
  public IList<ISomething> IsSomething { get; private set; }
  public Foo(int number, IList<Something> concreteType)
  {
    Number = number;

    // convert here, creates a new list
    IsSomething = concreteType.ConvertAll(x => (ISomething)x);
  }
}