泛型,其中T是类实现接口

And*_*ers 15 .net c# generics compact-framework

我有一个界面:

interface IProfile { ... }
Run Code Online (Sandbox Code Playgroud)

......和一个班级:

[Serializable]
class Profile : IProfile 
{ 
  private Profile()
  { ... } //private to ensure only xmlserializer creates instances
}
Run Code Online (Sandbox Code Playgroud)

...和一个经理方法:

class ProfileManager
{
  public T Load<T>(string profileName) where T : class, IProfile
  {
    using(var stream = new .......)
    {
      var ser = new XmlSerializer(typeof(T));
      return (T)ser.Deserialize(stream);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我希望这个方法可以像这样使用:

var profile = myManager.Load<Profile>("TestProfile"); // class implementing IProfile as T
Run Code Online (Sandbox Code Playgroud)

...并在此处抛出编译时错误:

var profile = myManager.Load<IProfile>("TestProfile"); // NO! IProfile interface entered!
Run Code Online (Sandbox Code Playgroud)

但是,所有内容都会编译,并且只会抛出运行时错误XmlSerializer.

我认为where T : class只会确保接受的类型?

如果输入IProfile(或继承自的其他接口IProfile),是否可以使编译器抛出错误,并且只IProfile接受类型实现的类?

Bob*_*ale 23

根据MSDN类意味着T必须是引用类型; 这也适用于任何类,接口,委托或数组类型.

一个解决方法是要求T实现参数less构造函数,以便:

where T : class, IProfile, new()
Run Code Online (Sandbox Code Playgroud)

  • 是的,我想到了这一点,除了C#希望构造函数是公开的.:( (3认同)
  • 这将无法工作,因为Load <AbstractBase>(...)仍然会在运行时编译并抛出异常.使用new()是解决此问题的最佳方法. (2认同)