C # Автоматически назначать свойства на основе других значений свойств - PullRequest
18 голосов
/ 29 августа 2010

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

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», потому что компилятор не t разрешить неявный оператор для связанных типов.

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

Ответы [ 3 ]

22 голосов
/ 29 августа 2010

Это возможно, используя автоматически реализованные свойства.Вы можете использовать установщик 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);
        }
    }
}
6 голосов
/ 29 августа 2010

Вы хотите иметь возможность установить 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;
        }
    }
}
5 голосов
/ 29 августа 2010

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

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}; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...