У меня есть базовый класс, который принимает два аргумента в своем конструкторе:
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;
}
}
Но это отклонено в текущей структуре с ошибкой:
Ошибка CS8107 Функция «объявление переменных выражений в инициализаторах и запросах членов» недоступна в C # 7.0.Пожалуйста, используйте языковую версию 7.3 или выше.
Есть альтернативные идеи?