Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 类/构造函数到操作<;T>;?_C#_Class_Generics_Constructor_Delegates - Fatal编程技术网

C# 类/构造函数到操作<;T>;?

C# 类/构造函数到操作<;T>;?,c#,class,generics,constructor,delegates,C#,Class,Generics,Constructor,Delegates,我有两个类,它们都继承自Stream类 FirstClass : Stream { FirstClass(Stream, CompressionMode) { .. } } SecondClass : Stream { SecondClass(Stream, CompressionMode) { .. } } 我想将这些类中的一个放在一个变量(我猜是动作)中,然后从该变量生成一个新对象,如下所示:

我有两个类,它们都继承自Stream类

FirstClass : Stream 
{
    FirstClass(Stream, CompressionMode) 
    {
         ..
    } 
}

SecondClass : Stream 
{
    SecondClass(Stream, CompressionMode) 
    {
         ..
    } 
}
我想将这些类中的一个放在一个变量(我猜是动作)中,然后从该变量生成一个新对象,如下所示:

Action<Stream, CompressionMode> classPattern = condition ? FirstClass : SecondClass

///And now this
var newObject = classPattern(Stream, CompressionMode);

///Or maybe even this
classPattern newObject = classPattern(Stream, CompressionMode);
Action classPattern=条件?头等舱:二等舱
///现在这个
var newObject=classPattern(流、压缩模式);
///或者甚至是这个
classPattern newObject=classPattern(流,压缩模式);
你怎么知道的


感谢您的帮助看来,您需要一个包含两个参数的

Func classPattern=(流,模式)=>条件?(流)新的第一级(流,模式):新的第二级(流,模式);
并使用它

var newObject=classPattern(流、压缩模式);
您还可以将其转换为本地函数

流类模式(流、压缩模式)=>
条件(流)新的第一级(流,模式):新的第二级(流,模式);

看起来,您需要一个包含两个参数的

Func classPattern=(流,模式)=>条件?(流)新的第一级(流,模式):新的第二级(流,模式);
并使用它

var newObject=classPattern(流、压缩模式);
您还可以将其转换为本地函数

流类模式(流、压缩模式)=>
条件(流)新的第一级(流,模式):新的第二级(流,模式);

我怀疑您是否真的需要这里的lambda(
Func
)。如果您有许多模式、条件和选项,labda将过于复杂而无法维护。我建议工厂级:


我怀疑你是否真的想要这里的lambda(
Func
)。如果您有许多模式、条件和选项,labda将过于复杂而无法维护。我建议工厂级:


Action
是一种
void
返回类型。您可能需要一个
Func
,其中最后一个泛型参数是返回类型。我建议实现一个工厂类,比如
public static class MyClassBuilder{public static Stream CreateMyClass(Stream parent,CompressionMode mode){…}
Action
void
返回类型。您可能需要一个
Func
,其中最后一个泛型参数是返回类型。我建议实现一个工厂类,比如
public static class MyClassBuilder{public static Stream CreateMyClass(Stream parent,CompressionMode模式){…}
public static class MyClassBuilder {
  public static Stream Create(Stream parent, CompressionMode mode) {
    // Note, that we can easily include validation into factory's method  
    if (null == parent)
      throw new ArgumentNullException(nameof(parent));

    return condition(mode, parent)  
      ? new FirstClass(parent, mode)
      : new SecondClass(parent, mode);
  }

  // It's easy to implement building with default mode:
  public static Stream Create(Stream parent, CompressionMode mode) =>
    Create(parent, CompressionMode.MaximumCompression);  
}
var newObject = MyClassBuilder.Create(someStream, someCompressionMode);

// with default CompressionMode
var otherObject = MyClassBuilder.Create(someOtherStream);