2016-12-21 4 views
1

У меня есть класс перечислимую ...Создайте пользовательский атрибут DisplayAttribute для перечислений?

public enum LeadStatus : byte 
{ 
    [Display(Name = "Created")] Created = 1, 
    [Display(Name = "Assigned")] Assigned = 2, 
    .... 
} 

Name, конечно, вне коробки. От МЕТАДАННЫЕ ...

namespace System.ComponentModel.DataAnnotations 
{ 
    public sealed class DisplayAttribute : Attribute 
    { 
     ... 
     public string Name { get; set; } 
     ... 
    } 
} 

Предположим, что я хотел, чтобы мой собственный пользовательский дисплей атрибуции, такие как «BackgroundColor» ...

[Display(Name = "Created", BackgroundColor="green")] Created = 1 

Я видел несколько других потоков здесь своего рода танец вокруг но контекст достаточно разный, что я не могу заставить его работать. Я предполагаю, что мне нужно создать класс расширения/переопределения, но я не представляю этого в своей голове.

Спасибо!

+0

Создание атрибута очень просто. просто наследуйте свой собственный класс от атрибута. позже вы можете извлечь информацию об атрибутах из членов перечисления. –

+0

Простите меня ... но «легко» может означать разные вещи для разных людей! –

+0

эй, пожалуйста, взгляните на ответ еще раз и скопируйте пасту. это будет работать. обратите внимание, что пространства имен важны, потому что вы хотите скрыть исходный 'DisplayAttribute' и использовать свои собственные. –

ответ

3

Имеет свой собственный атрибут.

public sealed class ExtrasDisplayAttribute : Attribute 
{ 
    public string Name { get; set; } 
    public string BackgroundColor { get; set; } 
} 

И этот метод расширения.

namespace ExtensionsNamespace 
{ 
    public static class Extensions 
    { 
     public static TAttribute GetAttribute<TAttribute>(Enum value) where TAttribute : Attribute 
     { 
      return value.GetType() 
       .GetMember(value.ToString())[0] 
       .GetCustomAttribute<TAttribute>(); 
     } 
    } 
} 

Теперь вы можете извлечь атрибут из перечисления, как это.

using static ExtensionsNamespace.Extensions; 

//... 

var info = GetAttribute<ExtrasDisplayAttribute>(LeadStatus.Created); 
var name = info.Name; 
var bg = info.BackgroundColor; 

//... 

public enum LeadStatus : byte 
{ 
    [ExtrasDisplay(Name = "Created", BackgroundColor = "Red")] Created = 1, 
    [ExtrasDisplay(Name = "Assigned")] Assigned = 2, 
} 

Если вы хотите по-прежнему использовать оригинальный атрибут, у вас тоже может быть это. , вы должны применить оба атрибута к одному перечислению.

public enum LeadStatus : byte 
{ 
    [Display(Name = "Created"), ExtrasDisplay(BackgroundColor = "Red")]Created = 1, 
    [Display(Name = "Assigned")] Assigned = 2, 
} 

И извлеките каждый из них, который вы хотите.

var name = GetAttribute<DisplayAttribute>(LeadStatus.Created).Name; 
var bg = GetAttribute<ExtrasDisplayAttribute>(LeadStatus.Created).BackgroundColor; 
+0

ОК! Благодаря! Я реализую. Скоро вернусь. –

+0

есть некоторые проблемы здесь .... BackgroundColor не распознается. «Тип или пространство имен BackgroundColor не найдено.«Я получаю это при попытке использовать его в качестве атрибута отображения в свойстве enum –

+0

Где в моем коде/проекте я помещаю метод расширения во второй кодовый блок? –

2

public sealed class DisplayAttribute : Attribute закрытый класс и, следовательно, вы не можете наследовать его и добавить другое поведение или свойства к нему.

Ниже мое предположение, но кто-то может звонить, если они знают, почему

И вы можете спросить, почему .NET разработчики сделали запечатанной? Мне интересно то же самое, и мое предположение заключается в том, что каждый из свойств в DisplayAttribute используется для ввода javascript, html и т. Д. Если они оставили его открытым и вы добавили к нему свойство BackgroundColor, что это значит? Что это будет в пользовательском интерфейсе?

+0

Итак, вы говорите, что это невозможно? Если это так, есть ли какое-то обходное решение? –

+0

нет необходимости наследовать или переопределять этот атрибут. просто вы можете написать свой собственный атрибут. мой ответ будет работать нормально. –

+0

Только я не получаю его на работу. Как я сказал в своем комментарии под вашим ответом, «BackgroundColor» не распознается. –

0

, заключив это, это невозможно, я пошел с другим видом решения. Не так аккуратно, как я надеялся, изначально, но он все еще выполняет свою работу.

Methods inside enum in C#

Смежные вопросы