インターフェイスのアプローチに言及している他の回答は確かに優れていますが、Linq-to-SQL を含む状況に応じて対応を調整したいと思います。
しかし、最初に、尋ねられた質問のタイトルに対処する
基本型なしでC#制約を使用できますか?
一般的に、答えはノーです。struct
具体的には、 、class
、またはを制約として使用できます。new()
これらは技術的には基本型ではなく、型の使用方法に関するガイダンスを提供します。これは、メソッドを特定のプロパティを持つ型に制限するという、やりたいことのレベルにはまったく達していません。そのためには、特定のインターフェイスまたは基本クラスに制約する必要があります。
特定のユースケースについては、Linq-to-SQL に言及しています。生成されたモデルから作業している場合は、生成されたモデル クラス ファイルを直接変更せずにそれらのクラスを変更するオプションが必要です。
あなたはおそらく次のようなものを持っています
// code generated by tool
// Customer.cs
public partial class Customer // : EntityBaseClasses, interfaces, etc
{
public int ID
{
get { /* implementation */ }
set { /* implementation */ }
}
}
また、アカウントや注文、またはその性質のものなどの他の同様のファイル。一般的に利用可能な ID プロパティを利用したいコードを書いている場合は、 を利用しpartial
て2 番目partial class
のクラス ファイルを定義し、これらのモデルに共通のインターフェイス タイプを導入することができます。
public interface IIdentifiableEntity
{
int ID { get; }
}
ここでの利点は、生成されたモデルに実装が既に存在するため、簡単に使用できることです。宣言するだけで、別のファイルで宣言できます。
public partial class Customer : IIdentifiableEntity { }
public partial class Account : IIdentifiableEntity { }
// etc.
このアプローチは、リポジトリ パターンを使用し、リポジトリGetById
ごとに同じボイラープレートを繰り返す必要のない一般的な方法を定義したい場合に、私にとって価値があることが証明されています。メソッド/クラスをインターフェイスに制約し、GetById
「無料」で取得できます。