gpt4 book ai didi

c# - 实例化参数化类型列表,更好地利用泛型和 Linq

转载 作者:行者123 更新时间:2023-11-30 14:19:38 24 4
gpt4 key购买 nike

我正在使用一种或多种哈希算法对文件进行哈希处理。当我尝试参数化我想要的哈希类型时,它比我希望的要困惑得多。

我想我错过了更好地利用泛型或 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com