Есть много способов достичь этого.Очень простой вариант - иметь второе перечисление с альтернативными идентификаторами ваших значений;например,
void Main()
{
Console.WriteLine((School)Enum.Parse(typeof(ConvertSchool),"A"));
}
public enum School
{
DVB=1,
AVD=2,
ASB=3
}
public enum ConvertSchool
{
D =1,
A =2,
B =3
}
Лучше создать какое-то отображение;например, используйте словарь, чтобы сопоставить каждый ключ символа с соответствующим значением школы:
public enum School
{
DVB=1,
AVD=2,
ASB=3
}
readonly IDictionary SchoolMap = new Dictionary<char,School>() {
{'D', School.DVB},
{'A', School.AVD},
{'B', School.ASB}
};
void Main()
{
Console.WriteLine(SchoolMap['A']);
}
Тем не менее, они подвержены ошибкам (например, если кто-то создал новую школу без создания новой записи ConvertSchool /составление словаря).Лучшим способом является переключение с enum
на class
, например
void Main()
{
Console.WriteLine((School)'A');
}
public class School
{
//list of enums
public static readonly List<School> Values = new List<School>();
//"enum" values
public static readonly School DVB = new School("DVB",'D',1);
public static readonly School AVD = new School("AVD",'A',2);
public static readonly School ASB = new School("ASB",'B',3);
//properties
public string Name {get;private set;}
public char Code {get;private set;}
public int Index {get;private set;}
//constructor
private School (string name, char code, int index)
{
if (Values.Exists(x => x.Name.Equals(name)) || Values.Exists(x => x.Code.Equals(code)) || Values.Exists(x => x.Index.Equals(index)))
{
throw new ArgumentException(string.Format("The Name, Code, and Index of each School value must be unique. \nName: '{0}'\nSchool: '{1}'\nIndex: {2}", name, code, index));
}
Name = name;
Code = code;
Index = index;
Values.Add(this);
}
//implicit conversion
public static implicit operator School(string schoolName)
{
return Values.First(x => x.Name.Equals(schoolName));
}
public static implicit operator School(char schoolCode)
{
return Values.First(x => x.Code.Equals(schoolCode));
}
public static implicit operator School(int index)
{
return Values.First(x => x.Index.Equals(index));
}
//how should it be displayed?
public override string ToString()
{
return Name;
}
//whatever other logic you need
}
В этом последнем примере, если передается символ, для которого нет соответствующей школы (например, Console.WriteLine((School)'X');
)вы получите InvalidOperationException
.Если вы не хотите здесь ошибок, а скорее получите значения null
, замените First
на FirstOrDefault
в каждом из операторов неявного преобразования.
Альтернативное решение заключается в удержанииотображение на уровне вашей базы данных;либо создание таблицы с сопоставленными значениями, либо даже сохранение этих сопоставлений в определении представления;затем используя вид таблицы, присоединенной к отображению, чтобы получить код из 3 символов вместо кода из 1 символа для каждой школы;например,
--if you have a SchoolMap table relating the 1 char code to the 3 char code:
create table SchoolMap
(
Char1Code nchar(1) not null primary key clustered
, Char3Code nvarchar(3) not null unique
)
create view SchoolView as
select School.*
, SchoolMap.Char3Code
from School
left outer join SchoolMap
on SchoolMap.Char1Code = School.Code
--if you don't have and don't want a table holding the mapping, you can do the same in the view's definition:
create view SchoolView as
select School.*
, SchoolMap.Char3Code
from School
left outer join
(
values ('D','DVB'),('A','AVD'),('B','ASB')
) SchoolMap (Char1Code, Char3Code)
on SchoolMap.Char1Code = School.Code