Ограничить объект несколькими типами - PullRequest
2 голосов
/ 03 марта 2020

Мне нужно держать объект в классе, который должен быть либо строкой, либо двойным. Как это сделать стилистически правильно? Мне пришла в голову идея создать перечисление с возможными типами и двумя методами для каждого типа для установки поля.

public class Operand
{
    /// <summary> Possible types of operand </summary>
    public enum TYPE
    {
        /// <summary> Number </summary>
        Numeric,
        /// <summary> Parameter </summary>
        Parameter,
        /// <summary> Invalid </summary>
        None
    }

    /// <summary> Type of operand </summary>
    public TYPE Type { private set; get; } = TYPE.None;

    /// <summary> Value of operand: double or string </summary>
    public object Value { private set; get; } = null;

    /// <summary> Set the parametric operand </summary>
    public void Set(string value)
    {
        Value = value;
        Type = TYPE.Parameter;
    }

    /// <summary> Set the numeric operand </summary>
    public void Set(double value)
    {
        Value = value;
        Type = TYPE.Numeric;
    }
}

Ответы [ 2 ]

0 голосов
/ 03 марта 2020

Я предлагаю решение с двумя разными полями для значений. Таким образом, мы избегаем упаковки и распаковки, когда значение удваивается. Он менее лаконичен c и требует ручной проверки поля Тип, но сохраняет ресурсы при использовании двойного типа

public class Operand
{
    /// <summary> Possible types of operand </summary>
    public enum TYPE
    {
        /// <summary> Number </summary>
        Numeric,
        /// <summary> Parameter </summary>
        Parameter,
        /// <summary> Invalid </summary>
        None
    }

    /// <summary> Type of operand </summary>
    public TYPE Type { private set; get; } = TYPE.None;

    public string StringValue { private set; get; }
    public double DoubleValue { private set; get; }

    /// <summary> Set the parametric operand </summary>
    public void Set(string value)
    {
        StringValue = value;
        Type = TYPE.Parameter;
    }

    /// <summary> Set the numeric operand </summary>
    public void Set(double value)
    {
        DoubleValue = value;
        Type = TYPE.Numeric;
    }
}
0 голосов
/ 03 марта 2020

Вы можете установить значение одним методом следующим образом:

public void Set(object value)
{
    if (value is String)
    {
        // Type string
    }
    else if (value is Double)
    {
        // type double
    }
}
...