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