web-dev-qa-db-ja.com

Tがクラス実装インターフェイスであるジェネリック

私はインターフェースを持っています:

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を実装する型クラスのみが受け入れられる場合、コンパイラーにエラーをスローさせることは可能ですか?

15
Anders

[〜#〜] msdn [〜#〜] クラスによれば、Tは参照型でなければならないことを意味します。これは、クラス、インターフェイス、デリゲート、または配列型にも適用されます。

回避策の1つは、Tがコンストラクターなしのパラメーターを実装することを要求することです。

where T : class, IProfile, new()
23
Bob Vale

私のために働く

public interface IUser
{
    int AthleteId { get; set; }
    string GivenName { get; set; }
    string FamilyName { get; set; }         
    bool IsActive { get; set; }
}

public  class DjsNameAutoSearch<Result, User> : where User : class, IUser, new()
0
David Jones