Создание словаря в атрибуте C# - PullRequest
1 голос
/ 08 апреля 2020

Я хочу построить словарь в атрибуте.

Я знаю об использовании AllowMultiple в C# атрибутах, но это вызывает вызов атрибута и (в моем случае, потому что это фильтр) срабатывает дважды.

По сути, я хочу, чтобы это поведение:

[MyAttribute("someKey", "value1", "value2", "value3")]
[MyAttribute("someOtherKey", "value1", "value2", "value3")]

В результате Dictionary<string, HashSet<string>> внутри MyAttribute. Однако по понятным причинам это не работает, так как каждая строка создает совершенно новый MyAttribute.

Есть ли какой-нибудь хороший способ обойти это? Атрибуты поддерживают это вообще, или мне нужно придумать какой-нибудь дерзкий способ передать аргументы в одно объявление атрибута?

Редактировать: я должен отметить ... Это для фильтра авторизации. Он должен работать для авторизации нескольких сред (ключей) для нескольких потенциальных значений. Однако я не могу использовать несколько экземпляров атрибута, потому что тогда фильтр будет срабатывать несколько раз.

1 Ответ

2 голосов
/ 08 апреля 2020

Вот один из способов вставить сложную информацию в Атрибут, используя тот же шаблон, что и System.ComponentModel.TypeConverterAttribute: скрывая сложность внутри Типа, и используя typeof (MyType) в качестве постоянной времени компиляции, данной Атрибуту.

public class MyAttributeAttribute : AuthorizeAttribute
{
    public MyAttributeAttribute(Type t) : base()
    {
        if (!typeof(MyAbstractDictionary).IsAssignableFrom(t))
        {
            // ruh roh; wrong type, so bail
            return;
        }
        // could also confirm parameterless constructor exists before using Activator.CreateInstance(Type)

        Dictionary<string, HashSet<string>> dictionary = ((MyAbstractDictionary)Activator.CreateInstance(t)).GetDictionary();
        this.Roles = "Fill Roles by using values from dictionary";
        // fill any other properties from the dictionary
    }
}

public abstract class MyAbstractDictionary
{
    public abstract Dictionary<string, HashSet<string>> GetDictionary();
}

public class MyDictionary : MyAbstractDictionary
{
    public MyDictionary() { } // gotta have a parameterless constructor; add it here in case we actually make another constructor
    public override Dictionary<string, HashSet<string>> GetDictionary()
    {
        Dictionary<string, HashSet<string>> dict = new Dictionary<string, HashSet<string>>();
        // build dictionary however you like
        return dict;
    }
}

Абстрактный класс используется для создания различных типов, которые возвращают разные словари.

И использование:

[MyAttribute(typeof(MyDictionary))]
public class ClassToAttribute { }

Затем можно go включить создать класс MyDictionary2 с другим словарем и использовать его в качестве typeof () для приписывания других вещей. Теперь вы также можете использовать информацию времени выполнения (!) Для построения словаря, а не только жестко закодированные значения.

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