Sophexが述べているように、一般的な関数を記述して、何かを処理することができます。List<>
IList<>
したがって、あなたの例は次のようになります。
public string TestBadal<T>(IList<T> list)
{
return "test";
}
これは非常に一般的であり、 についてはほとんど必要とせず、暗示するものでもありませんT
。これは、実行したい処理には十分かもしれませんが、あなたは言いません。
一般に、メソッド シグネチャは、呼び出し元が関数に対して行わなければならない約束と見なす必要があります。promise は、関数がその仕事をするために必要なものだけに制限する必要があります。このようにすると、プロミスを作成しやすくなり、呼び出し元のコミットメントを抑えて関数をより再利用できます。
あなたの関数はそのままでは、実際にはパラメーターを必要とせず、より適切に定義されるでしょうがstring const
、あなたがやりたかったのは、使用できるアイテムを列挙することだけでした.
public string TestBadal<T>(IEnumerable<T> entities)
{
foreach(T entity in entities)
{
...
}
}
処理がデータ ソースのEFの性質に特に関連している場合は、
public string TestBadal<TEntity>(EntitySet<TEntity> entities)
where TEntity : class
{
...
}
リスト内のタイプについて何かを知る必要がある場合は、2 つの賢明なオプションがあります。特定のインターフェイスを実装するために型が必要な場合、これは本質的に関数を非ジェネリックにし、EF と組み合わせて扱いにくい可能性があります。
public string TestBadal(IEnumerable<IDefinedType> definedTypeInstances)
{
foreach(IDefinedType instance in definedTypeInstances)
{
var x = instance.SomeDefinedProperty;
}
}
または、関数の非ジェネリック部分を型指定されたデリゲートパラメーターとして取得し、関数をジェネリックのままにすることもできます。たとえば、このようなものです。
public string TestBadal<T>(
IList<T> list,
Func<T, string> stringSelector)
{
var result = new StringBuilder();
for(var i = 0; i < list.Count; i++)
{
result.AppendLine(stringSelector(list[i])
}
return result.ToString();
}
この関数は、次のようなラムダ式で呼び出すことができます。
var result = TestBadal(entities, e => e.SomeStringProperty);
この回答があなたにいくつかのアイデアを与え、正しい答えはあなたの機能が何を達成したいかによって決まるという私の主張を示してくれることを願っています.