#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
{
}