我正在尝试扩展课程并设法扩展List<T>
以获得乐趣:
public static void SomeCustomSort<T>(this List<T> list, string item)
{
if (typeof(T) != typeof(string) || list.Count == 0)
return;
// doStuff();
}
我想知道是否有一种更智能的方法可以仅为List<T>
扩展List<string>
,这样我的扩展方法就无法列出,也无法访问任何其他类型T
答案 0 :(得分:8)
只是让你的方法非泛型:
public static void SomeCustomSort(this List<string> list, string item)
并指定它应与
配合使用的确切类型注意:使用void方法,即使你想将扩展方法参数限制为某些类型的集合(例如某些接口的所有实现者或某些非密封类,其中包含从中派生的类),我不建议使用泛型方法和参数约束:
public static void SomeCustomSort<T>(this List<T> animals)
where T: IAnimal
为什么呢?因为它使代码过于复杂。非泛型方法比泛型方法更容易理解。没有约束的通用方法比具有约束的通用方法更容易理解。您应该从易于理解的最简单的解决方案开始。听起来更自然的是什么?
何时使用泛型类型约束?从方法返回项目时,您不希望丢失有关列表项的确切类型的信息。考虑通过某种重量过滤器返回动物的方法
public static IEnumerable<IAnimal> WhereWeightBelow(this List<IAnimal> animals, int weight)
如果您将狗列表传递给此方法,您将失去方法输出中所有狗特定信息的智能感知。
dogs.WhereWeightBelow(10).Where(d => d. /* oops only IAnimal members here */)
返回通用类型将为您保留所有狗信息。
答案 1 :(得分:4)
只需指定T
,而不是将其作为通用方法。
public static void SomeCustomSort(this List<string> list, string item)
答案 2 :(得分:4)
另一个尚未提及的替代方案:
s
这允许您指定多于一种类型,例如:
public static void SomeCustomSort<T>(this List<T> list, string item)
where T: YourSpecificType
答案 3 :(得分:3)
只需在扩展方法
上准确定义字符串类型即可public static void SomeCustomSort(this List<string> list, string item)
{
// doStuff();
}
答案 4 :(得分:1)
您也可以使用这样的约束(在此示例中,T必须是Project类型):
public static void SomeCustomSort<T>(this List<T> list, string item)
where T : Project
{
}