Использование Enum в качестве аргумента атрибута - PullRequest
6 голосов
/ 15 сентября 2009

Вот код, который я хотел бы использовать:

public enum Days { Sat = 1, Sun, Mon, Tue, Wed, Thu, Fri };

[EnumHelper(typeof(Days))]
public Days DayOfWeek { get; set; }

EnumHelper выглядит так:

[AttributeUsage(AttributeTargets.Property,AllowMultiple=true)]
public class EnumHelper : Attribute
{
    public Type MyEnum { get; set; }
    public EnumHelper(Type enum)
    {
        MyEnum = enum;
    }
}

Ошибка, которую я получаю в EnumHelper (Days), заключается в том, что «Enum Name недопустимо в данный момент» Я что-то делаю не так или это нельзя?

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ

Я пытаюсь передать Enum (Дни) и случайно вернуть одно из значений.

НЕВЕРМИНД: Я слишком усложнял эту часть.

Ответы [ 4 ]

15 голосов
/ 15 сентября 2009

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

[AttributeUsage(AttributeTargets.Property,AllowMultiple=true)]
public class EnumHelper : Attribute
{
    public Type EnumType;
    public EnumHelper(Type enumType)
    {
        EnumType = enumType;
    }
}

...

[EnumHelper(typeof(Days))]
public Days DayOfWeek { get; set; }

Тем не менее:

  • Я бы лично не сделал EnumType публичным полем; сделать его собственностью.
  • В настоящее время нет подтверждения, что EnumType является на самом деле перечислением. Вы не можете сделать это во время компиляции, но вы могли бы сделать это во время выполнения.
  • Для удобства его следует назвать EnumHelperAttribute (или, на самом деле, что-то более наглядное) - это не вызывает ошибку, но более идиоматично
  • Я не совсем уверен, что вижу выгоду ... вы уже можете найти тип свойства по метаданным; Как вы думаете, что атрибут на самом деле покупает вас?

Если бы вы могли сообщить нам, чего вы пытаетесь достичь, мы могли бы быть более полезными для вас.

10 голосов
/ 15 сентября 2009

Параметры в Атрибутах могут быть только константами. Если вы хотите передать тип перечисления, вы должны передать только тип:

[EnumHelper(typeof(Days))]
public Days DayOfWeek { get; set; }


[AttributeUsage(AttributeTargets.Property,AllowMultiple=true)]
public class EnumHelper : Attribute
{
    public Type MyEnum;
    public EnumHelper(Type enum)
    {
        MyEnum = enum;
    }
}
0 голосов
/ 20 июля 2017

Просто хотел добавить, как я столкнулся с этим и исправил его. Моя собственность была названа так же, как мое перечисление. Код компилируется и запускается, но я получаю сообщение об ошибке красной строки в IDE. Изменение имени свойства на что-то уникальное очистило сообщение.

0 голосов
/ 15 сентября 2009

Параметр должен быть значением перечисления, а не типом перечисления, например:

[EnumHelper(Days.Sat)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...