특성을 사용하여 열거에 주석을 지정한 다음 리플렉션을 사용하여 사전을 작성할 수 있습니다.
[AttributeUsage(AttributeTargets.Field)]
sealed class TemplateAttribute : Attribute {
public TemplateAttribute(String fileName) {
FileName = fileName;
}
public String FileName { get; set; }
}
enum EmailTemplate {
[Template("File1.htm")]
WelcomeEmail,
[Template("File2.htm")]
ConfirmEmail
}
class KnownTemplates {
static Dictionary<EmailTemplate, String> knownTemplates;
static KnownTemplates() {
knownTemplates = typeof(EmailTemplates)
.GetFields(BindingFlags.Static | BindingFlags.Public)
.Where(fieldInfo => Attribute.IsDefined(fieldInfo, typeof(TemplateAttribute)))
.Select(
fieldInfo => new {
Value = (EmailTemplate) fieldInfo.GetValue(null),
Template = (TemplateAttribute) Attribute
.GetCustomAttribute(fieldInfo, typeof(TemplateAttribute))
}
)
.ToDictionary(x => x.Value, x => x.Template.FileName);
}
}
이에게 많이 할 경우 해당 열거 형 값과 관련된 속성을 열거 값을 결합하여보다 일반적인 일반적인 함수를 만들 수 있습니다
static IEnumerable<Tuple<TEnum, TAttribute>> GetEnumAttributes<TEnum, TAttribute>()
where TEnum : struct
where TAttribute : Attribute {
return typeof(TEnum)
.GetFields(BindingFlags.Static | BindingFlags.Public)
.Where(fieldInfo => Attribute.IsDefined(fieldInfo, typeof(TAttribute)))
.Select(
fieldInfo => Tuple.Create(
(TEnum) fieldInfo.GetValue(null),
(TAttribute) Attribute.GetCustomAttribute(fieldInfo, typeof(TAttribute))
)
);
}
을 그리고 다음과 같이 사용 :
knownTemplates = GetEnumAttributes<EmailTemplate, TemplateAttribute>()
.ToDictionary(tuple => tuple.Item1, tuple => tuple.Item2.FileName);
더 재미있게하려면 확장 방법을 만들 수 있습니다.
static class EmailTemplateExtensions {
static Dictionary<EmailTemplate, String> templates;
static EmailTemplateExtensions() {
templates = GetEnumAttributes<EmailTemplate, TemplateAttribute>()
.ToDictionary(tuple => tuple.Item1, tuple => tuple.Item2.FileName);
}
public static String FileName(this EmailTemplate emailTemplate) {
String fileName;
if (templates.TryGetValue(emailTemplate, out fileName))
return fileName;
throw new ArgumentException(
String.Format("No template defined for EmailTemplate.{0}.", emailTemplate)
);
}
}
그런 다음 EmailTemplate.ConfirmEmail.FileName()
을 호출하면 File2.htm
가 반환됩니다.
나는 'class sFile = EmailTemplate.Confirm.TemplateFile;'과 같은 구문을 사용하여 클래스 사용을 제거하려고한다고 생각한다. – AMissico
Martin! 고맙습니다! 애트리뷰트는 대부분의 상황 (문자열이 적절한 상황)에 적합한 솔루션입니다. 나는 복잡한 객체가 각 열거 형으로 매핑되는 경우를 알고 있지만이 경우에도 소수의 스칼라를 처리 할 수 있습니다. – shannon
더 많이 사용할수록 더 멋지게됩니다. 다시 마틴, 고마워. – shannon