Возврат анонимных типов из метода и доступ к членам без отражения.
// 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;
}
Возможно, «постоянный» объект ?
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.
Перейти к редактированию Вы пробовали это (что не работает, поскольку вы проверили и прокомментировали):
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
типы. В этом случае ваш код ничуть не изменится.
Если вы используете .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
Хотели бы вы, чтобы это сработало?
public Enum StatusCode : int{
[StringValue("U")]
Unknown =0,
[StringValue["F"]
Failuer=1
}
Если у вас есть таблица с именем StatusCode, которая включает целочисленный первичный ключ, вы можете использовать его в качестве идентификатора, а также подключить его к своей логике. И в этом случае лучше всего было бы использовать перечисление. Хотя я не уверен, возможно ли это для вас.
Один из вариантов - настроить перечисление с именами, идентичными значениям в вашей базе данных, например:
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;
}
Коротко и мило, дружище .. Делает все, что вам нужно. Вам не нужно использовать enum, потому что оно вам не нужно для присвоения внутреннего значения вашим возможным состояниям, вы уже знаете значения своих состояний.
public sealed class StatusCode
{
public const string Unknown= "U";
public const string Failure= "F";
public const string Success= "S";
}