2008-12-30 50 views
3

我认为测试我对泛型函数的理解的好方法是创建一个函数,该函数将使用从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()。我甚至没有意识到我可以有多种限制。在我完全理解我能用泛型做的所有事情之前,我一定有一条路要走。我想你可以做一个非泛型的泛型函数,如果你太过于束缚约束。

回答

3

尝试添加new()子句的你泛型约束结尾:

这告诉“HashAlgorithmToUse”有一个参数(缺省)构造函数的类型。应该做的伎俩。

+0

通过一分钟打我。 – recursive 2008-12-30 00:34:57

0

至少在Visual Studio 2008中,添加new()约束的功能得到了它的编译我:

public static string GetHexHash<HashAlgorithmToUse>(Stream dataStreamToHash) where HashAlgorithmToUse : HashAlgorithm, new() 
{ 
    // ... 
} 
相关问题