С# Автоматически присваивать свойство на основе других значений свойств

Если у меня есть некоторые типы, например:

public class SomeType //Generated by some codegen i won't to change that.
{
    string C { get; set; }        
}

public class AnotherType : SomeType
{
    string A { get; set; }
    string B { get; set; }
}

Можно ли автоматически присвоить свойство C? Например, когда свойства A и B назначаются или когда я передаю этот тип другому типу или как-то еще?

В принципе, например, я хочу выполнить некоторую логику, чтобы автоматически присваивать свойство C в соответствии со значениями A и B в какой-то момент, когда заполняются значения свойств A и B.

Есть ли другие способы сделать это, а не использовать стандартные свойства?

Я думал, что можно сделать некоторого короля магии, когда я могу наложить тип AnotherType на SomeType, но я не могу реализовать неявный оператор, где я могу поместить эту логику преобразования "от A + B до C", потому что компилятор doesn ' t допускает неявный оператор для связанных типов.

Теперь только так, как я вижу, это удаление наследования и реализация неявного оператора для преобразования AnotherType в SomeType, но зло в этом случае мне нужно дублировать все свойства типа SomeType в типе AnotherType, и мне нужно каждый раз менять тип AnotherType вручную когда SomeType будет изменен.

Ответы

Ответ 1

Это возможно с использованием автоматически реализованных свойств. Вы можете использовать установщик B для присвоения значения C:

public class SomeType
{
    public string A { get; set; }
    public string C { get; set; }

    private string _b;
    public string B 
    { 
        get { return _b; } 
        set 
        { 
            // Set B to some new value
            _b = value; 

            // Assign C
            C = string.Format("B has been set to {0}", value);
        }
    }
}

Ответ 2

Хотите ли вы установить C или просто получить его? Если вам не нужно устанавливать значение, тогда я думаю, что вы хотите:

public class MyClass
{
    private string _a = "not set";
    private string _b = "not set";

    public string A
    {
        get { return _a; }
        set { _a = value; }
    }

    public string B
    {
        get { return _b; }
        set { _b = value; }
    }

    public string C
    {
        get
        {
            if (_a != "not set" && _b != "not set")
                return "not set";
            else
                return "set";
        }
    }
}

Здесь приведен более простой пример доступа к свойству, зависящему от другого свойства:

public class MyClass
{
    private double[] MyArray = new double[5];

    public int NumElements
    {
        get
        {
            return MyArray.Length;
        }
    }
}

Ответ 3

Не знаю, что я знаю, вам придется использовать стандартные свойства болота следующим образом (если вы знаете только об автоматических свойствах)

public class SomeType
{
    string _A;
    string _B;
    string _C;

    public string A { get{return _A;}  set{ _A = value; _C = _A + _B; } }
    public string B { get{return _B;} set{ _B = value; _C = _A + _B; }
    public string C { get{return _C}; }
}