我认为测试我对泛型函数的理解的一个好方法是创建一个函数,该函数将使用从HashAlgorithm继承的类之一吐出哈希的十六进制表示。由于所有HashAlgorithm类都提供ComputeHash,我认为这很简单。当我构建这样一个函数。但是,我得到一个错误,因为HashAlgorithm本身不提供构造函数。我找不到任何提供构造函数的HashAlgorithm接口或子类。如果不是所有的HashAlgorithm类都需要支持构造函数,那么我可以在泛型类型上使用一些额外的约束来确保类型提供一个空构造函数,或者我将被强制为每个我知道提供的HashAlgorithm类创建一个重载一个空构造函数。
这是我到目前为止(在非编译状态下):
public static string GetHexHash<HashAlgorithmToUse>(Stream dataStreamToHash) where HashAlgorithmToUse : HashAlgorithm
{
StringBuilder Result = new StringBuilder();
byte[] ByteHash = (new HashAlgorithmToUse()).ComputeHash(dataStreamToHash);
foreach (byte HashByte in ByteHash)
{
Result.Append(HashByte.ToString("X2"));
}
return Result.ToString();
}
编辑马特·汉密尔顿的回答立即将其钉死,只是使通用约束变得更加复杂:where HashAlgorithmToUse : HashAlgorith, new()
。我甚至没有意识到我可以有多个限制。在我完全理解Generics所能做的一切之前,我肯定还有一段路要走。我想你可以制作一个非通用的泛型函数,如果你对约束条件太过分了。
答案 0 :(得分:3)
尝试将new()
子句添加到通用约束的末尾:
public static string GetHexHash<HashAlgorithmToUse>(Stream dataStreamToHash)
where HashAlgorithmToUse : HashAlgorithm, new()
这告诉类型“HashAlgorithmToUse”具有无参数(默认)构造函数。应该做的伎俩。
答案 1 :(得分:0)
至少在Visual Studio 2008中,将new()
约束添加到函数中让它为我编译:
public static string GetHexHash<HashAlgorithmToUse>(Stream dataStreamToHash) where HashAlgorithmToUse : HashAlgorithm, new()
{
// ...
}