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

时间:2014-03-07 10:29:28

标签: c# .net generics compact-framework

我有一个界面:

interface IProfile { ... }

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

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

......和一位经理用方法:

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);
    }
  }
}

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

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

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

var profile = myManager.Load<IProfile>("TestProfile"); // NO! IProfile interface entered!

但是,所有内容都会编译,XmlSerializer只会引发运行时错误。

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

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

2 个答案:

答案 0 :(得分:23)

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

一个解决方法是要求T实现参数less constructor:

where T : class, IProfile, new()

答案 1 :(得分:0)

为我工作

<div class="container">
    <div class="row">

        <div class="col-md-3 col-md-offset-1 text-center">
            <img alt="TBD" width="100%" src="https://via.placeholder.com/150" />
        </div>

        <div class="col-md-3 col-md-offset-1 text-center">
            <img alt="TBD" width="100%" src="https://via.placeholder.com/150" />
        </div>

        <div class="col-md-3 col-md-offset-1 text-center">
            <img alt="TBD" width="100%" src="https://via.placeholder.com/150" />
        </div>

    </div><!-- end row -->
</div><!-- end container -->