【问题标题】:Class / constructor to Action<T>?Action<T> 的类/构造函数?
【发布时间】:2020-07-17 12:23:37
【问题描述】:

我有两个类,它们都继承自 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);

你是怎么做到的?

感谢您的帮助

【问题讨论】:

  • Actionvoid 返回类型。您可能需要Func,其中最后一个泛型参数是返回类型。
  • 我建议实现一个 factory 类,比如public static class MyClassBuilder {public static Stream CreateMyClass(Stream parent, CompressionMode mode) {...}}

标签: c# class generics constructor delegates


【解决方案1】:

我怀疑你是否真的想要任何 lambda (Func&lt;Stream, CompressionMode, Stream&gt;)。如果您有许多模式、条件、选项,labda 将过于复杂而无法维护。我建议工厂类

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);

【讨论】:

    【解决方案2】:

    看来,您需要一个带有两个参数的Func delegate

    Func<Stream, CompressionMode, Stream> classPattern = (stream, mode) => condition ? (Stream)new FirstClass(stream, mode) : new SecondClass(stream, mode);
    

    并使用它

    var newObject = classPattern(stream, compressionMode);
    

    您也可以将其转换为本地函数

    Stream ClassPattern(Stream stream, CompressionMode mode) =>
        condition ? (Stream) new FirstClass(stream, mode) : new SecondClass(stream, mode);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-19
      • 1970-01-01
      • 2017-01-21
      相关资源
      最近更新 更多