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