Как реализовать перечисление C# для перечислимого символа (1) поле базы данных?

Возврат анонимных типов из метода и доступ к членам без отражения.

// Useful? probably not.
private void foo()
{
    var user = AnonCast(GetUserTuple(), new { Name = default(string), Badges = default(int) });
    Console.WriteLine("Name: {0} Badges: {1}", user.Name, user.Badges);
}

object GetUserTuple()
{
    return new { Name = "dp", Badges = 5 };
}    

// Using the magic of Type Inference...
static T AnonCast<T>(object obj, T t)
{
   return (T) obj;
}
5
задан Daniel Pryden 24 July 2009 в 21:27
поделиться

7 ответов

Возможно, «постоянный» объект ?

public sealed class StatusCode {
    private char value;

    public static readonly StatusCode Unknown = new StatusCode('U');
    public static readonly StatusCode Failure = new StatusCode('F');

    private StatusCode(char v) {
        value = v;
    }

    public override string ToString() {
        return value.ToString();
    }

}

Затем, позже в коде, вы можете использовать его как перечисление: StatusCode.Unknown . Вы также можете предоставить внутренний метод для «синтаксического анализа» полученного значения в объект StatusCode.

5
ответ дан 14 December 2019 в 13:43
поделиться

Перейти к редактированию Вы пробовали это (что не работает, поскольку вы проверили и прокомментировали):

public enum StatusCode : char
{
    Failure = 'F',
    Unknown = 'U',
    ...
}

РЕДАКТИРОВАТЬ - правильное решение
или это (возможно, даже попробуйте со структурой):

public sealed class StatusCode
{
    public static readonly char Failure = 'F';
    public static readonly char Unknown = 'U';
    ...
    public char Value { get; set; }
}

предоставленный вами код будет работать следующим образом:

public void DoSomething(StatusCode currentStatus) {
    if(currentStatus.Value == StatusCode.Failure) {
        throw new SomeException();
    }

    switch(currentStatus.Value) {
        case StatusCode.Unknown:
            // do something
            break;
    }
}

Если вы не хотите использовать свойство Value , вы всегда можете реализовать оператор неявного равенства между StatusCode и char типы. В этом случае ваш код ничуть не изменится.

1
ответ дан 14 December 2019 в 13:43
поделиться

Если вы используете .NET 2.0 и выше, вы можете реализовать это, используя общий словарь:

Dictionary<char,string> statusCode = new Dictionary<char,string>();
statusCode.Add('U', "Unknown");
statusCode.Add('F', "Failure");

или, альтернативно:

Dictionary<char,StatusCode> statusCode = new Dictionary<char,StatusCode>();
statusCode.Add('U', StatusCode.Unknown);
statusCode.Add('F', StatusCode.Failure);

, и вы можете получить доступ к строковому представлению для данного кода вот так:

string value = statusCode['A'];

или

StatusCode myCode = statusCode['A'];

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

Marc

0
ответ дан 14 December 2019 в 13:43
поделиться

Хотели бы вы, чтобы это сработало?

public Enum StatusCode : int{
   [StringValue("U")]
   Unknown =0,
   [StringValue["F"]
   Failuer=1
}
0
ответ дан 14 December 2019 в 13:43
поделиться

Если у вас есть таблица с именем StatusCode, которая включает целочисленный первичный ключ, вы можете использовать его в качестве идентификатора, а также подключить его к своей логике. И в этом случае лучше всего было бы использовать перечисление. Хотя я не уверен, возможно ли это для вас.

0
ответ дан 14 December 2019 в 13:43
поделиться

Один из вариантов - настроить перечисление с именами, идентичными значениям в вашей базе данных, например:

enum StatusCode
{
    /// <summary>Unknown</summary>
    U = 0,
    /// <summary>Failure</summary>
    F,
    /// <summary>Etc</summary>
    E
}

Затем используйте статический метод для преобразования значений char в значение перечисления

    private StatusCode CharToEnum(string statusCodeChar)
    {
        foreach (FieldInfo fi in typeof(StatusCode).GetFields())
        {
            if (fi.Name == statusCodeChar) return (StatusCode)fi.GetValue(null);
        }

        return StatusCode.U;
    }
0
ответ дан 14 December 2019 в 13:43
поделиться

Коротко и мило, дружище .. Делает все, что вам нужно. Вам не нужно использовать enum, потому что оно вам не нужно для присвоения внутреннего значения вашим возможным состояниям, вы уже знаете значения своих состояний.

public sealed class StatusCode
{
    public const string Unknown= "U";
    public const string Failure= "F";
    public const string Success= "S";
}
0
ответ дан 14 December 2019 в 13:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: