は、このような方法で宣言します。
protected abstract void Validate<T>(IEnumerable<T> records)
をそして、このようにそれを呼び出す:コンパイラは、ジェネリックメソッドの型は、明示的にこれを含める必要はありませんを推測することができるはず
Validate(records);
。あなたは本当に種類や型推論が、何らかの理由で失敗した場合(コンパイラがあなたに文句を言われますので、あなたがこのことを知っているだろう)を含むようにしたい場合は、この操作を行うことができます。
は
Validate<LogEventRecord>(records);
次に、あなたの実装では、レコードを使用することができますこのような:
protected override void Validate<T>(IEnumerable<T> records)
{
//you can use a foreach loop
foreach (T record in records)
{
}
//Or "linq" operators:
bool isValid = records.Any(r => r.IsNotValid);
//Or linq query comprehension syntax:
bool isValid2 = (from r in records
where r.IsNotValid
select r).Any();
}
しかし、今、あなたが知っている唯一のものは、およそT
は、それがオブジェクトであるということです。あなたは "オブジェクト"型の変数をあまり使うことができないので、これはあまり有用ではありません。実際、.IsNotValid
プロパティはおそらく存在しないため、サンプルの後の2つのオプションは今すぐ失敗します。
代わりに、この関数で使用するオブジェクトを記述するインターフェイスが必要です(おそらく既に存在しているかもしれません)。おそらく、常にログまたは共通の基本型のレコードのいずれかになります。その場合、2つの選択肢があります。 1つは、ジェネリックタイプを制約することです。
protected abstract void Validate<T>(IEnumerable<T> records) where T : MyRecordInterface
他のオプションは、C#4で(あなたがの必要性を回避できるようになるIEnumerabe < T>などのインターフェイス上での分散のための新しいサポートがあるということです:あなたはこのようなあなたのメソッドのシグネチャを変更することでそれを行います。一般的な全くただのVisual Studio 2010以降では、.NET 4を使用していることを確認し、次のようにメソッドを宣言し、これを利用するには、ここの方法:
protected abstract void Validate(IEnumerable<MyRecordInterface> records)
は、.NET 4が必要ではなく、以前のバージョンのフレームワークを対象としたC#4を使用しています。これはIEnumerable < T>インターフェイスの.Net 4バージョンが必要なためです。分散のための必要なサポートを含むように構築されています。
最後に、3番目のオプションがあります。
protected abstract void Validate<T>(IEnumerable<T> records, Func<T, bool> isValid)
:あなたはそうのように、ブールにリスト内の各項目を変換するためにあなたの方法にdelegate
パラメータを追加することができます。
protected override void Validate<T>(IEnumerable<T> records, Func<T, bool> isValid)
{
bool recordsAreValid = records.Any(r => !isValid(r));
}
。
Validate(records, l => ((LogEventRecord)l).IsValid);
のIListはほとんど常にをリストにpreferrableで、IEnumerableをはほとんどいつものIList にpreferrableです。 –