열거 형의 유형이 int 여야하기 때문에 다음이 불가능하다는 것을 알고 있습니다.
enum GroupTypes
{
TheGroup = "OEM",
TheOtherGroup = "CMB"
}
내 데이터베이스에서 나는 (incomprehensive 코드로 필드를 얻을 OEM
및CMB
s) . 이 분야를 enum
이해하기 쉬운 것으로 만들고 싶습니다 . 대상이 가독성이면 솔루션이 간결해야합니다.
다른 옵션이 있습니까?
답변
더 열거 형처럼 보이기 때문에 메서드 대신 클래스에서 속성 을 사용 하고 싶습니다.
로거의 예는 다음과 같습니다.
public class LogCategory
{
private LogCategory(string value) { Value = value; }
public string Value { get; set; }
public static LogCategory Trace { get { return new LogCategory("Trace"); } }
public static LogCategory Debug { get { return new LogCategory("Debug"); } }
public static LogCategory Info { get { return new LogCategory("Info"); } }
public static LogCategory Warning { get { return new LogCategory("Warning"); } }
public static LogCategory Error { get { return new LogCategory("Error"); } }
}
으로 이동 형태 보증 된 문자열 값 매개 변수로 :
public static void Write(string message, LogCategory logCategory)
{
var log = new LogEntry { Message = message };
Logger.Write(log, logCategory.Value);
}
용법:
Logger.Write("This is almost like an enum.", LogCategory.Info);
답변
확장 모델을 사용할 수도 있습니다.
public enum MyEnum
{
[Description("String 1")]
V1= 1,
[Description("String 2")]
V2= 2
}
확장 수업
public static class MyEnumExtensions
{
public static string ToDescriptionString(this MyEnum val)
{
DescriptionAttribute[] attributes = (DescriptionAttribute[])val
.GetType()
.GetField(val.ToString())
.GetCustomAttributes(typeof(DescriptionAttribute), false);
return attributes.Length > 0 ? attributes[0].Description : string.Empty;
}
}
용법:
MyEnum myLocal = MyEnum.V1;
print(myLocal.ToDescriptionString());
답변
상수가있는 정적 클래스를 사용하는 것은 어떻습니까?
static class GroupTypes
{
public const string TheGroup = "OEM";
public const string TheOtherGroup = "CMB";
}
void DoSomething(string groupType)
{
if(groupType == GroupTypes.TheGroup)
{
// Be nice
}
else if (groupType == GroupTypes.TheOtherGroup)
{
// Continue to be nice
}
else
{
// unexpected, throw exception?
}
}
답변
열거의 항목에 특성을 추가 한 다음 리플렉션을 사용하여 특성에서 값을 가져올 수 있습니다.
속성을 적용하려면 “field”지정자를 사용해야합니다.
enum GroupTypes
{
[field:Description("OEM")]
TheGroup,
[field:Description("CMB")]
TheOtherGroup
}
그런 다음 열거 형 유형의 정적 필드 (이 경우 GroupTypes) DescriptionAttribute
를 반영하고 리플렉션을 사용하여 찾고 있던 값을 가져옵니다 .
public static DescriptionAttribute GetEnumDescriptionAttribute<T>(
this T value) where T : struct
{
// The type of the enum, it will be reused.
Type type = typeof(T);
// If T is not an enum, get out.
if (!type.IsEnum)
throw new InvalidOperationException(
"The type parameter T must be an enum type.");
// If the value isn't defined throw an exception.
if (!Enum.IsDefined(type, value))
throw new InvalidEnumArgumentException(
"value", Convert.ToInt32(value), type);
// Get the static field for the value.
FieldInfo fi = type.GetField(value.ToString(),
BindingFlags.Static | BindingFlags.Public);
// Get the description attribute, if there is one.
return fi.GetCustomAttributes(typeof(DescriptionAttribute), true).
Cast<DescriptionAttribute>().SingleOrDefault();
}
DescriptionAttribute
속성이 적용되는지 여부를 결정할 수있는 경우 위의 내용 을 반환하기로 선택했습니다 .
답변
실제로 매우 쉽게 할 수 있습니다. 다음 코드를 사용하십시오.
enum GroupTypes
{
OEM,
CMB
};
그런 다음 각 열거 형 요소의 문자열 값을 얻으려면 다음 코드 줄을 사용하십시오.
String oemString = Enum.GetName(typeof(GroupTypes), GroupTypes.OEM);
나는 과거 에이 방법을 성공적으로 사용했으며 상수 클래스를 사용하여 문자열 상수를 유지했지만 둘 다 잘 작동하지만 선호하는 경향이 있습니다.
답변
정적 클래스에 상수를 추가하십시오. Type으로 끝나지 않지만 읽을 수 있고 체계적인 상수가 있습니다.
public static class GroupTypes {
public const string TheGroup = "OEM";
public const string TheOtherGroup = "CMB";
}
답변
다음을 포함하는 DB에 대한 두 번째 열거 형을 작성하십시오.
enum DBGroupTypes
{
OEM = 0,
CMB = 1
}
이제 Enum.Parse를 사용하여 문자열 “OEM”및 “CMB”에서 올바른 DBGroupTypes 값을 검색 할 수 있습니다. 그런 다음 해당 값을 int로 변환하고 모델에서 추가로 사용하려는 올바른 열거에서 올바른 값을 검색 할 수 있습니다.