Как вызвать конструктор универсального типа внутри функции базового типа без собственного конструктора?

Я подумал, что отличным способом проверить свое понимание универсальных функций было бы создание функции, которая будет выдавать шестнадцатеричное представление хеша, используя один из классов, наследуемых от 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(). Я даже не осознавал, что у меня может быть несколько ограничений. Мне определенно предстоит пройти долгий путь, прежде чем я полностью пойму все, что могу делать с дженериками. Я полагаю, вы можете сделать очень неуниверсальную, универсальную функцию, если слишком увлечетесь ограничениями.


person patridge    schedule 30.12.2008    source источник


Ответы (2)


Попробуйте добавить предложение new() в конец общих ограничений:

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

Это сообщает типу, что "HashAlgorithmToUse" имеет конструктор без параметров (по умолчанию). Должен сделать трюк.

person Matt Hamilton    schedule 30.12.2008

По крайней мере, в Visual Studio 2008 добавление ограничения new() к функции заставило ее скомпилировать для меня:

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