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





Попробуйте добавить предложение new() в конец общих ограничений:
public static string GetHexHash<HashAlgorithmToUse>(Stream dataStreamToHash)
where HashAlgorithmToUse : HashAlgorithm, new()
Это сообщает типу, что "HashAlgorithmToUse" имеет конструктор без параметров (по умолчанию). Должен сделать свое дело.
По крайней мере, в Visual Studio 2008 добавление ограничения new() к функции заставило ее скомпилировать для меня:
public static string GetHexHash<HashAlgorithmToUse>(Stream dataStreamToHash) where HashAlgorithmToUse : HashAlgorithm, new()
{
// ...
}