Странная ошибка атрибута - PullRequest
3 голосов
/ 22 января 2012

У меня было счастливое решение, и я добавил этот атрибут:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, AllowMultiple = false, Inherited = true)]
public class metadata : Attribute
{
    string mid;
    string mdescription;
    Dictionary<string, string> mdata;
    public string id
    {
        get
        {
            return mid;
        }
    }
    public string description
    {
        get
        {
            return mdescription;
        }
    }
    public Dictionary<string, string> data
    {
        get
        {
            return mdata;
        }
    }
    public metadata(string thisid, string thisdescription, params KeyValuePair<string, string>[] thisdataarray)
    {
        mid = thisid;
        mdescription = thisdescription;
        mdata = new Dictionary<string, string>();
        if (thisdataarray != null)
        {
            foreach (KeyValuePair<string, string> thisvaluepair in thisdataarray)
            {
                mdata.Add(thisvaluepair.Key, thisvaluepair.Value);
            }
        }
    }
}

Я добавил несколько объявлений этого атрибута, все [метаданные (ноль, ноль)] без ошибок.Каким-то образом, когда я компилирую, для каждого [metadata (null, null)] возникает «ошибка CS0182: аргумент атрибута должен быть константным выражением, выражением typeof или выражением создания массива типа параметра атрибута», однако без строки или столбцаили файл, только проект.Что пошло не так?Спасибо.

Ответы [ 2 ]

6 голосов
/ 22 января 2012

Проблема в том, что KeyValuePair не поддерживается как тип параметра атрибута. Согласно спецификации C # Language :

Типы позиционных и именованных параметров для класса атрибута ограничены типами параметров атрибута:

  • Один из следующих типов: bool, byte, char, double, float, int, длинный, sbyte, короткий, строка, Uint, Ulong, Ushort.
  • Тип объекта.
  • Тип System.Type.
  • Тип enum при условии, что он имеет общедоступный доступ и типы в который вложен (если есть) и имеет общедоступный доступ.
  • Одномерные массивы указанных типов.

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

0 голосов
/ 22 января 2012

То, как вы объявили массив, является подозрительным, я не думаю, что вам нужно ключевое слово params. Я не думаю, что вы хотите 0 или более массивов ключей-значений, я думаю, что вы ищете один массив с 0 или более записей. Удалите ключевое слово params и установите в качестве значения по умолчанию thisdataarray значение null.

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