Как вызвать конструктор универсального типа в функции базового типа без собственного конструктора? - PullRequest
3 голосов
/ 30 декабря 2008

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

Ответы [ 2 ]

3 голосов
/ 30 декабря 2008

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

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

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

0 голосов
/ 30 декабря 2008

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

public static string GetHexHash<HashAlgorithmToUse>(Stream dataStreamToHash) where HashAlgorithmToUse : HashAlgorithm, new()
{
    // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...