Использование словаря в классе атрибутов

#c# #attributes

Вопрос:

Я пытаюсь реализовать Attribute класс, в котором мне также нужно передать Dictionary<string, object> в нем.

При попытке сделать то же самое возникает ошибка

ABC.cs(8366,6): ошибка CS0181: Параметр конструктора атрибутов «Настройки» имеет тип » Словарь<строка, объект>», который не является допустимым типом параметра атрибута.

 [AttributeUsage(AttributeTargets.All)]
public class TestAttribute: Attribute
{
    public string cName{ get; private set; }
    public string oName { get; private set; }
    public string aUser { get; private set; }
    public Dictionary<string, object> Settings { get; private set; }

    public TestAttribute(string cName, string oName, string aUser = null
        Dictionary<string, object> Settings = null)
    {
        this.cName= cName;
        this.oName= oName;
        this.aUser = aUser ;
        this.Settings = Settings ;
    }
}
 

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

Комментарии:

1. Все параметры, которые вы передаете атрибуту, должны быть доступны во время компиляции. object << might not be available.

2. @PeterCsala : Как и предлагалось, я изменил его с object до string сих пор я получаю ту же ошибку ABC.cs(132,6): ошибка CS0181: Параметр конструктора атрибутов «Настройки» имеет тип » Словарь<строка, строка>», который не является допустимым типом параметра атрибута

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

Ответ №1:

Из документов видно, что в атрибуте можно использовать только определенные типы:

Измените тип данных параметра на Byte , Short , Integer , Long , Single , Double , Char , String , Boolean , System.Type , или тип перечисления.

Так что нет, вы Dictionary вообще не можете использовать a.

Нужно еще немного подумать об этом. Поскольку вы назвали свойство «Настройки», это предполагает, что значение в любом случае должно быть получено из файла конфигурации, поэтому, возможно, это следует принять во внимание. Другой альтернативой было бы использовать массив строк в качестве пар ключ/значение и проанализировать их. Например:

 public TestAttribute(string cName, string oName, string aUser = null,
    params string[] Settings) // use params to make it easier to specify values
{
    //snip

    // This is just an example and should include error checking etc.
    this.Settings = Settings
        .Select(s => s.Split('='))
        .ToDictionary(s => s[0], s=> s[1]);     
}
 

А теперь используйте его вот так:

 [Test("cname", "oname", "auser", "Setting1=Foo", "Setting2=Bar")]
public class Foo
{
    
}