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

标签 c# generics types covariance contravariance

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

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

相关文章:

java - 将内容放入 Map<?,?> 或将 Map<String,String> 转换为 Map<?,?>

reactjs - 键入 React HOC 的正确方法是什么?

java - 将字符串用于非字符串特定数据的缺点是什么?

c# - 如何找到哪个矩形最接近一个点

c# - 从 XML 序列化数组中删除包装元素

c# - 引用我自己的类型的最佳方式

c# - 如何在 Deedle 框架中将值从 <string> 转换为 <double> 类型?

c# - 没有 Action 的 ASP MVC 路由

c# - 在使用 include 语句急切加载时处理 Entity Framework 的缓慢性能?

java - Spring:如何从实现通用接口(interface)的应用程序上下文中获取bean?