C#
パターン5: where T : EntityBase —基底クラス制約
出典: C# Generic 制約 (where T : …) — 業務SE が型安全コードを書く5パターン — パターン5: where T : EntityBase —基底クラス制約
//基底クラス
public abstract class EntityBase
{
public int Id { get; set; }
public DateTime CreatedAt { get; set; }
}
public class User : EntityBase
{
public string Name { get; set; }
}
public class Order : EntityBase
{
public decimal Amount { get; set; }
}
// ✅ TはEntityBaseの派生のみ
public class Repository<T> where T : EntityBase, new()
{
public T FindById(int id)
{
var entity = new T(); // new()制約で保証
entity.Id = id; // EntityBase制約でIdプロパティ参照可能
// ...実際はDBから取得して詰める
return entity;
}
}
//使い方
var userRepo = new Repository<User>(); // OK: UserはEntityBase派生
var orderRepo = new Repository<Order>(); // OK: Orderも派生
// var strRepo = new Repository<string>(); // ❌ stringはEntityBase派生じゃない
▸ この snippet は実行結果未収録
▸ 実行結果は未収録です
Source収録記事
この snippet は記事の「パターン5: where T : EntityBase —基底クラス制約」セクションに登場する。コードの前後の文脈・ハマりどころの解説は記事本文で。
同じ記事から
9 件// ❌コンパイルエラー: CS0403 public static T GetDefault<T>() { T item = null; // 'T'を'null'に変換できません未収録
なぜジェネリック制約が必要なのか— T item = null;がコンパイルエラーになる理由
#ea71b9dd152d
// ✅対処1: where T : classで参照型に絞る public static T GetDefault<T>()where T : class { T item = null; // OK未収録
なぜジェネリック制約が必要なのか— T item = null;がコンパイルエラーになる理由
#9b560add64cf
// ✅ Tは参照型のみ public class Cache<T> where T : class { private readonly Dictionary<string, T> _store = new Dictionary<string, T>();未収録
パターン1: where T : class —参照型のみ許容
#5262b3f47b63
// ✅ Tは値型のみ(int / DateTime / struct / enum) public class NullableWrapper<T> where T : struct { private T? _value; // Nullable<T>として宣言未収録
パターン2: where T : struct —値型のみ許容
#1bef6345d897
// ❌制約なしだと実行時MissingMethodExceptionリスクあり public class FactoryBroken<T> { public T Create()未収録
パターン3: where T : new() —引数なしコンストラクタを持つ型のみ
#4b27b8ab4d3c
// ✅ TはIDisposable実装のみ public class DisposableScope<T> where T : IDisposable { private readonly T _resource;未収録
パターン4: where T : IDisposable — Interface実装制約
#13cf670d5462
