代码之家  ›  专栏  ›  技术社区  ›  patridge jonathanpeppers

如何在没有基类型自身构造函数的函数中对泛型类型调用构造函数?

  •  3
  • patridge jonathanpeppers  · 技术社区  · 17 年前

    我认为测试我对泛型函数理解的一个很好的方法是创建一个函数,使用继承自hashAlgorithm的一个类来构造哈希的十六进制表示。因为所有的hashAlgorithm类都提供computehash,所以我认为这很简单。当我构造这样一个函数时。但是,我得到了一个错误,因为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() . 我甚至没有意识到我可能有多种限制。在我完全理解我对仿制药所能做的一切之前,我肯定还有一条路要走。我想,如果您对约束太过着迷,您可以创建一个非常非泛型、泛型的函数。

    2 回复  |  直到 17 年前
        1
  •  3
  •   Matt Hamilton    17 年前

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

    public static string GetHexHash<HashAlgorithmToUse>(Stream dataStreamToHash)
        where HashAlgorithmToUse : HashAlgorithm, new()
    

    这告诉类型“hashAlgorithmTouse”具有无参数(默认)构造函数。应该有技巧。

        2
  •  0
  •   Andy    17 年前

    至少在Visual Studio 2008中,添加 new() 函数的约束使它为我编译:

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