正如Sophex所说,您可以编写一个通用函数来处理 aList<>
或更好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
{
...
}
如果您需要了解列表中的类型,那么您有两个明智的选择。要么您需要类型来实现某个接口,这本质上使您的函数非泛型,并且与 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();
}
您可以使用类似这样的 lambda 表达式调用此函数,
var result = TestBadal(entities, e => e.SomeStringProperty);
我希望这个答案既能给你一些想法,又能说明我的观点,即正确的答案取决于你希望你的函数实现什么。