使用 where T : Interface 的通用扩展方法
Generic extension methods using where T : Interface
这 2 种扩展方法是否相同,或者使用 2 种中的 1 种是否存在一些危险
public static T GetSomthingFromListOf<T>(this List<T> list)where T: IMyInterface
{
//do somthing that returns an item of T
}
对
public static IMyInterface GetSomthingFromList(this List<IMyInterface> list)
{
//do somthing that returns an item of IMyInterface
}
唯一真正的区别在于 return 类型,第一个将 return 类型本身并对其进行约束,使其必须实现 IMyInterface
,第二个将只是 return IMyInterface
个实例。
当您只想公开接口的成员时,第二个很有用;第一个适用于当您 需要 到 return 原始类型时,但请确保您可以在方法中将其视为 IMyInterface
.
除了@Clint 回答:
1) 如果您有 List<ConcreteType>
的实例 - 只有通用扩展方法可用
2) 如果您将 struct
作为参数传递给需要接口的非泛型方法 - 将发生装箱
这 2 种扩展方法是否相同,或者使用 2 种中的 1 种是否存在一些危险
public static T GetSomthingFromListOf<T>(this List<T> list)where T: IMyInterface
{
//do somthing that returns an item of T
}
对
public static IMyInterface GetSomthingFromList(this List<IMyInterface> list)
{
//do somthing that returns an item of IMyInterface
}
唯一真正的区别在于 return 类型,第一个将 return 类型本身并对其进行约束,使其必须实现 IMyInterface
,第二个将只是 return IMyInterface
个实例。
当您只想公开接口的成员时,第二个很有用;第一个适用于当您 需要 到 return 原始类型时,但请确保您可以在方法中将其视为 IMyInterface
.
除了@Clint 回答:
1) 如果您有 List<ConcreteType>
的实例 - 只有通用扩展方法可用
2) 如果您将 struct
作为参数传递给需要接口的非泛型方法 - 将发生装箱