简而言之,你不能用泛型解决你的问题(防止IEnumerable<>
被传递给泛型方法)。这是因为您不能有负面的通用约束(即,除 之外的所有内容someClass
)。存在泛型约束的唯一原因是允许编译器知道泛型类型上期望的签名。它不是为开发人员提供设计时提示。
除了任何未指定的外部要求外,您还可以在接口而不是方法上定义泛型类型。这不保证T
不能执行IEnumerable<>
;但是,它确实确保ValidateList
必须接受传递给的任何内容的列表Validate
。这意味着T
可以是一个数组,但这将强制ValidateList
接受一个数组数组。
如果您将泛型类型留在方法级别,即使它们都有一个名为 的泛型类型T
,这些类型实际上彼此之间没有任何关系。
在接口处定义的通用类型。
public interface ISomeInterface<T>
{
ValidationResult Validate(T t);
IList<ValidationResult> ValidateList(IEnumerable<T> entities);
}
这将像这样实现:
public class SomeClass<T> : ISomeInterface<T>
{
ValidationResult Validate(T t)
{
// Do something ...
}
IList<ValidationResult> ValidateList(IEnumerable<T> entities)
{
// Do something ...
}
}
并像这样使用:
var myInstance = new SomeClass<int>();
int obj = 5;
int arr = new [] {1,2,3};
myInstance.Validate(obj);
myInstance.ValidateList(arr);
myInstance.Validate(arr); // should throw compiler error