作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用一种或多种哈希算法对文件进行哈希处理。当我尝试参数化我想要的哈希类型时,它比我希望的要困惑得多。
我想我错过了更好地利用泛型或 LINQ 的机会。我也不喜欢我必须使用 Type[] 作为参数而不是将其限制为更具体的类型集(HashAlgorithm 后代),我想将类型指定为参数并让此方法执行正在构建,但如果我让调用者传入 HashAlgorithm 的新实例,这看起来会更好吗?
public List<string> ComputeMultipleHashesOnFile(string filename, Type[] hashClassTypes)
{
var hashClassInstances = new List<HashAlgorithm>();
var cryptoStreams = new List<CryptoStream>();
FileStream fs = File.OpenRead(filename);
Stream cryptoStream = fs;
foreach (var hashClassType in hashClassTypes)
{
object obj = Activator.CreateInstance(hashClassType);
var cs = new CryptoStream(cryptoStream, (HashAlgorithm)obj, CryptoStreamMode.Read);
hashClassInstances.Add((HashAlgorithm)obj);
cryptoStreams.Add(cs);
cryptoStream = cs;
}
CryptoStream cs1 = cryptoStreams.Last();
byte[] scratch = new byte[1 << 16];
int bytesRead;
do { bytesRead = cs1.Read(scratch, 0, scratch.Length); }
while (bytesRead > 0);
foreach (var stream in cryptoStreams)
{
stream.Close();
}
foreach (var hashClassInstance in hashClassInstances)
{
Console.WriteLine("{0} hash = {1}", hashClassInstance.ToString(), HexStr(hashClassInstance.Hash).ToLower());
}
}
最佳答案
为什么要以 Types
的形式提供类型并创建它们,而不是只允许用户传入 HashAlgorithm
的实例?这似乎可以完全缓解这个问题。
如果这是一个要求,那么你所拥有的实际上是唯一的解决方案,因为你不能在泛型类型或函数上指定可变数量的类型参数(这似乎是你需要的,因为它是一个现在是数组),并且您不能强制传入的类型属于特定的继承线(就像您不能强制整数参数介于 1 和 10 之间一样)。这种验证只能在运行时完成。
关于c# - 实例化参数化类型列表,更好地利用泛型和 Linq,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2405862/
我是一名优秀的程序员,十分优秀!