奇怪的属性错误
本文关键字:错误 属性 | 更新日期: 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。