C# 如何将参数传递到使用操作的StreamedPipeline<;小溪,小溪>;

C# 如何将参数传递到使用操作的StreamedPipeline<;小溪,小溪>;,c#,action,pipeline,C#,Action,Pipeline,我在MSDN杂志()上读了一篇关于.Net StreamedPipeline实现的文章 不过我有一个挑战 在实现中,他们让它调用Compress和Encrypt方法: using (FileStream input = File.OpenRead("inputData.bin")) using (FileStream output = File.OpenWrite("outputData.bin")) using (StreamPipeline pipeline = new StreamPipe

我在MSDN杂志()上读了一篇关于.Net StreamedPipeline实现的文章

不过我有一个挑战

在实现中,他们让它调用
Compress
Encrypt
方法:

using (FileStream input = File.OpenRead("inputData.bin"))
using (FileStream output = File.OpenWrite("outputData.bin"))
using (StreamPipeline pipeline = new StreamPipeline(Compress, Encrypt))
{
    pipeline.Run(input, output);
}
这些方法是预定义的,除
参数外,没有任何参数

static void Compress(Stream input, Stream output){
    using (GZipStream compressor = new GZipStream(
           output, CompressionMode.Compress, true))
        CopyStream(input, compressor);
}

static void Encrypt(Stream input, Stream output) {
    RijndaelManaged rijndael = new RijndaelManaged();
    ... // setup crypto keys
    using (ICryptoTransform transform = rijndael.CreateEncryptor())
    using (CryptoStream encryptor = new CryptoStream(
            output, transform, CryptoStreamMode.Write))
        CopyStream(input, encryptor);
}
我真正想做的是如何将其他额外的非流参数发送到管道。e、 如果是加密,我想发送密钥并将其包含在管道调用中如何使用附加参数实现相同的功能?

您可以尝试以下方法:

    byte[] key = // ... your key
    byte[] iv = // ... your initialization vector

    using (FileStream input = File.OpenRead("inputData.bin"))
    using (FileStream output = File.OpenWrite("outputData.bin"))
    using (StreamPipeline pipeline = new StreamPipeline(
        Compress, 
        (i, o) => Encrypt(i, o, key, iv)
    ))
    {
        pipeline.Run(input, output);
    }

static void Compress(Stream input, Stream output){
    using (GZipStream compressor = new GZipStream(
           output, CompressionMode.Compress, true
    ))
        CopyStream(input, compressor);
}

static void Encrypt(Stream input, Stream output, byte[] key, byte[] iv) {
    RijndaelManaged rijndael = new RijndaelManaged();
    using (ICryptoTransform transform = rijndael.CreateEncryptor(key, iv))
    using (CryptoStream encryptor = new CryptoStream(
            output, transform, CryptoStreamMode.Write
    ))
        CopyStream(input, encryptor);
}

您需要使用函数式编程技术。实际上,您可以创建另一个匿名函数来捕获参数并将其应用于实际函数

var additionalCompressionArgument = 123;
using (FileStream input = File.OpenRead("inputData.bin"))
using (FileStream output = File.OpenWrite("outputData.bin"))
using (StreamPipeline pipeline = new StreamPipeline(
   (input, output) => Compress(input, output, additionalCompressionArgument), 
    Encrypt))
{
    pipeline.Run(input, output);
}

static void Compress(Stream input, Stream output, int additionalCompressionParameter){
    using (GZipStream compressor = new GZipStream(
           output, CompressionMode.Compress, true))
        CopyStream(input, compressor);
}

“没有任何参数”然后我建议您添加参数。那不管用吗?我看的不是你看的同一页。。。我找不到任何有关StreamedPipeline或Compress的引用。更糟糕的是,谷歌只找到了这个带有StreamedPipelineThank@xanatos的页面,更正了!谢谢@metadings+1,如果他们允许两个答案,他们会给你的答案打上标记,但必须选择@Tim Rogers,因为它解释了
它是什么。从你的好答案中什么也不拿走!谢谢你解释这是什么
@Tim Rogers!。。。我不知道这个解决方案是功能性的。为你不知道的东西取个名字总是好的