Назначить enum как свойство c # - PullRequest
0 голосов
/ 27 августа 2018

Я не нашел ответа на форуме (однако, если он есть, сообщите мне). Я пишу бэкэнд-структуру для приложения ASP.NET MVC, и у меня возникают проблемы с C # case.

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

Я определил Enum следующим образом:

public enum myEnum
{
    FirstOpt = 0,
    SecondOpt= 1,
    ThirdOpt = 2,

    Unknown = -1,
}

Теперь я хочу назначить myEnum в другой части моего решения в пользовательском атрибуте.

Атрибут выглядит следующим образом:

    public class SearchTypeAttribute : Attribute
    {
        public Type SType { get; set; }

        public IEnumerable<object> SItems { get; set; }
    }

Тогда я хочу использовать его следующим образом:

public class SomeClass
{
    [Key]
    public long Id { get; set; }

    [SearchTypeAttribute(
        SType = typeof(Enums.myEnum),
        SItems =  Enum.GetValues(typeof(Enums.myEnum))
    )]
    public string Type{ get; set; } // later to this item will be assigned string name of the assigned value
 }

Когда я это делаю, появляется следующая ошибка:

Ошибка CS0655 «SItems» не является допустимым аргументом именованного атрибута, поскольку он не является допустимым типом параметра атрибута

Я также пытался присвоить его как здесь:

public class SomeClass
{
    [Key]
    public long Id { get; set; }

    [SearchTypeAttribute(
        SType = typeof(Enums.myEnum),
        SItems =  Enums.myEnum // here !
    )]
    public string Type{ get; set; } 

 }

Но я до сих пор не знаю, какой «тип» свойства я должен использовать в своем SearchTypeAttribute, чтобы иметь возможность назначать эти значения там.

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

Какие типы я должен использовать для назначения этого типа данных SItems ? Есть ли другой подход, чтобы сделать это? Я еще не очень продвинут в C #. Спасибо за любую помощь заранее.

1 Ответ

0 голосов
/ 27 августа 2018

Атрибут - это вещь времени компиляции .Таким образом, вы должны предоставить всю информацию на время компиляции также.Однако Enum.GetValues будет выполняться в время выполнения , что делает невозможным использование для атрибута.Единственный способ добиться этого - записать возможные значения перечисления непосредственно в атрибут:

public class SomeClass
{
    [Key]
    public long Id { get; set; }

    [SearchTypeAttribute(
        SType = typeof(Enums.myEnum),
        SItems =  new[] { Enums.FirstOpt, Enums.SecondOpt, ...}
    )]
    public string Type{ get; set; } 

 }

Кроме этого, я не могу понять, почему ваш SItems имеет тип IEnumerable<object>, когда оночевидно, содержит только Enums -элементов.Даже невозможно использовать IEnumerable для атрибута, разрешены только массивы примитивных типов, как упоминалось здесь .Таким образом, SItems должен быть Enums[].

. Другой подход заключается в использовании конструктора атрибутов и инициализации SItems оттуда:

public class SearchTypeAttribute : Attribute
{
    public SearchTypeAttribute(Type type)
    {
        this.SType = type;
        this.SItems = Enum.GetValues(type);
    }

}

Теперь просто используйте атрибут следующим образом:

[SearchTypeAttribute(typeof(Enums.myEnum))]
public string Type{ get; set; } 
...