我让这个解决方案愉快地工作,我添加了这个属性:
[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)]都没有错误。不知何故,当我编译时,对于每个[metadata(null,null)],“错误CS0182:属性参数必须是常量表达式,属性参数类型的typeof表达式或数组创建表达式”,但是没有行或列或文件,只有项目。什么地方出了错?感谢。
答案 0 :(得分:6)
问题是KeyValuePair不支持作为属性参数类型。 根据{{3}}:
属性类的位置和命名参数的类型仅限于属性参数类型,它们是:
作为一种解决方法,您可以传递一个字符串数组,其中奇数成员是键,甚至成员都是值。然后在属性构造函数中,您可以创建Dictionary。
答案 1 :(得分:0)
你声明数组的方式是可疑的,我认为你不需要params关键字。我认为您不想要0个或更多keyvaluepair数组,我认为您正在寻找具有0个或更多条目的单个数组。删除params关键字,并将thisdataarray的默认值设置为null。