【问题标题】:Cannot create an instance of an interface C#无法创建接口 C# 的实例
【发布时间】:2017-05-12 10:49:58
【问题描述】:

当基本接口属于某种类型时,我在尝试将接口添加到基本接口列表时遇到问题。

我的接口定义如下:

    public interface IWorkspace<out TWorkspace> where TWorkspace : IWorkspaceBaseModel { }
    public interface IWorkspaceBaseModel : IViewBaseModel { }
    public interface ILogCollectionViewModel : IWorkspace<IWorkspaceBaseModel> { }

我使用以下代码获取所有接口:

    foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
    {
       var workspaces = assembly
          .GetTypes()
          .Where(t => typeof(IWorkspace<IWorkspaceBaseModel>).IsAssignableFrom(t) && t.IsInterface)
          .ToList();

       if (workspaces.Count > 0)
          foreach (var wvm in workspaces)
          {
             var myInterface = (IWorkspaceBaseModel)Activator.CreateInstance(wvm);
          }
    }

我收到错误消息“无法创建接口的实例”。当我输入以下代码时:

    var myInterface = (IWorkspace<IWorkspaceBaseModel>)Activator.CreateInstance(wvm);

然后我要做的是在创建接口后将接口添加到基本接口列表中:

    var viewList = new List<IWorkspaceBaseModel>();

    viewList.Add(myInterface);    

任何有关如何解决此问题或更好的解决方法的帮助将不胜感激。

【问题讨论】:

  • 在发布的代码中没有CreateInstance 需要的具体类。使用反射时也不能新建接口。
  • 您应该多了解一下interface 是什么以及如何使用它。
  • 我尝试使用 .Where(t => typeof(IWorkspace).IsAssignableFrom(t) && !t.IsInterface) 来查找类而不是接口,但这也不起作用
  • 有时一个接口只能来自某些方法的返回值,而不是创建的实例。所以你可能找不到这样的构造函数。
  • 我的具体类是:LogCollectionViewModel : WorkspaceBaseModel, ILogCollectionViewModel { } 和 WorkspaceBaseModel : IWorkspaceBaseModel { }

标签: c# reflection interface


【解决方案1】:

我不知道你的意图到底是什么,但你只能创建类的实例(可以实现你的接口)。

也不可能写(如果IViewModel是一个接口):

var myInstance = new IViewModel();

您可以找到实现接口的类:

var assembly = this.GetType().GetTypeInfo().Assembly;
var classes = assembly.DefinedTypes.Where(type => type.ImplementedInterfaces.Any(i => i == typeof(IPageViewModel)));

如果你想在之后创建一个实例,你还必须检查非抽象类。

【讨论】:

  • 我正在尝试获取所有继承 IWorkspaceBaseModel 的接口并将它们添加到列表中,以便我可以将它们用于导航
  • 如果要获取接口,需要检查类型是否为接口。 type => type.ImplementedInterfaces.Any(i => i == typeof(IPageViewModel)) && type.IsInterface
  • 如果我这样做并尝试将接口添加到我的列表中,我会收到“无法将'System.RuntimeType'类型的对象转换为'InterfaceAssemblyTest.IWorkspaceBaseModel'”消息
猜你喜欢
  • 2012-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多