奇怪的属性错误

本文关键字:错误 属性 | 更新日期: 2023-09-27 18:21:14

我让这个解决方案运行得很好,我添加了这个属性:

[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);
            }
        }
    }
}

我添加了一些这个属性的声明,所有的元数据(null,null)]都没有错误。不知怎的,当我编译时,对于每个[元数据(null,null)],都会出现"错误CS0182:属性参数必须是属性参数类型的常量表达式、typeof表达式或数组创建表达式",但没有行、列或文件,只有项目。出了什么问题?谢谢

奇怪的属性错误

问题是KeyValuePair不支持作为属性参数类型。根据C#语言规范:

属性类的位置参数和命名参数的类型仅限于属性参数类型,它们是:

  • 以下类型之一:bool、byte、char、double、float、int、,long、sbyte、short、string、uint、ulong、ushort
  • 类型对象
  • 类型System.type
  • 枚举类型,前提是它具有公共可访问性,并且中的类型它嵌套的(如果有的话)也具有公共可访问性
  • 上述类型的一维数组

作为一种变通方法,您可以传递一个字符串数组,其中奇数成员是键,偶数成员是值。然后在属性构造函数中,您可以创建Dictionary。

您声明数组的方式是可疑的,我认为您不需要params关键字。我认为您不想要0个或更多的key-valuepair数组,我认为您正在寻找一个包含0个或多个条目的单个数组。删除params关键字,并将thisdataarray的默认值设置为null。