私はインターフェースを持っています:
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
を実装する型クラスのみが受け入れられる場合、コンパイラーにエラーをスローさせることは可能ですか?
[〜#〜] msdn [〜#〜] クラスによれば、Tは参照型でなければならないことを意味します。これは、クラス、インターフェイス、デリゲート、または配列型にも適用されます。
回避策の1つは、Tがコンストラクターなしのパラメーターを実装することを要求することです。
where T : class, IProfile, new()
私のために働く
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()