c# - 使用从单个参数派生的两个参数调用基本构造函数

标签 c# .net constructor initialization

我有一个基类,它的构造函数有两个参数:

public class BaseClass {
    public BaseClass(string key, object value) { ... }
}

我的派生类的构造方式不同,使用单个复杂参数,然后我可以将其拆分为基类参数。

public class DerivedClass : BaseClass {
    public DerivedClass (string keyValuePair)
        : BaseClass( SomethingExpensive(keyValuePair).Key,
                     SomethingExpensive(keyValuePair).Value) { }

    private static KeyValuePair<string,object> SomethingExpensive(string input) { 
         // Do expensive things
         return new KeyValuePair<string,object>(derivedKey, derivedValue);
    }    
}

考虑到我无法控制 BaseClass 并且不能给它一个新的构造函数,我试图找到任何方法来传递这些参数而无需调用 SomethingExpensive 两次。


我考虑过在第一次调用期间使用 out 参数为附加构造函数参数生成一个新标识符:

public class DerivedClass : BaseClass {
    public DerivedClass (string keyValuePair)
        : BaseClass( SomethingExpensive(keyValuePair, out object _value), _value) { }

    private static string SomethingExpensive(string input, out object value) { 
         // Do expensive things
         value = derivedValue;
         return derivedKey;
    }    
}

但这在当前框架中被拒绝并出现错误:

Error CS8107 Feature 'declaration of expression variables in member initializers and queries' is not available in C# 7.0. Please use language version 7.3 or greater.

还有其他想法吗?

最佳答案

我可以想到 2 种不同的方法,尽管不是彻底的解决方案:

  1. 可以把键值对的解析结果缓存起来,这样第二次调用就不会很昂贵了
  2. 您可以使用 has-a 而不是 is-a 关系模型。这样基类就不是派生的,而是一个包含的对象,由同一个接口(interface)包装和暴露。

希望这对您有所帮助。

关于c# - 使用从单个参数派生的两个参数调用基本构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54815212/

相关文章:

c# - C# 中的监视器数组

c# - 在 BluePrism 中引用 Office 互操作对象

c# - PsExec 未检测到我的 C# 控制台应用程序已完成

c++ - 节点和二叉树构造函数和析构函数段错误

JavaScript:如何在父类的构造函数中获取子类的方法?

c# - 检查 gridview 列复选框

c# - linq语法匹配动态sql IN语句

c# - 财务申请中的小数点位置不正确

c# - 如何在 C# 中向从数据集 Writexml 生成的 XML 添加额外信息?

c# - 静态构造函数会导致性能开销?