[英]How do I call a constructor on a generic type within a function of a base type without its own constructor?
我認為測試我對泛型函數的理解的一個很好的方法是創建一個函數,該函數將使用從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();
}
編輯 Matt Hamilton的答案立即將其釘住,簡單地使通用約束變得更復雜: 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()
{
// ...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.