嗨我需要c#
中属性的动态数组例如:
public class MyHtmlAttributesAttribute : System.Attribute
{
private IDictionary<string, string> Attrib { get; set; }
public MyHtmlAttributesAttribute()
{
Attrib = new Dictionary<string, string>();
}
public MyHtmlAttributesAttribute(params string[][] values)
: this()
{
foreach (var item in values)
{
if (item.Count() < 1)
throw new Exception("bad length array");
this.Attrib.Add(item[0].ToLower(), item[1]);
}
}
}
但是当我想使用这个属性时,我得到错误: 数组初始值设定项只能在变量或字段初始值设定项中使用。请尝试使用新表达式
我通过这种风格使用这个属性:
public class LoginViewModel
{
[Required]
[MyHtmlAttributes(new string[][]{{"Class", "ltr"}, {"AutoCompleteType" , "Disabled"}})]
public string Email { get; set; }
...
..
}
谢谢你的回答
答案 0 :(得分:1)
问题不在于这种情况下的属性,而是在数组初始化中。 {{"Class", "ltr"}, {"AutoCompleteType" , "Disabled"}}
可以在数组初始值设定项中使用,但不能在新的[]表达式中使用。
使用新表达式:new string[][] {new string[] { "Class", "ltr" }, new string[]{ "AutoCompleteType", "Disabled" } };
但是由于使用了params
,因此可以省略封装新字符串[]:
[MyHtmlAttributes(new string[]{"Class", "ltr"}, new string[]{"AutoCompleteType" , "Disabled"})]
以下是纯粹的替代
另一种方法是允许应用属性的多个实例,并在获取它们时将它们组合起来。
允许多个属性:
[AttributeUsage(AttributeTargets.Property, AllowMultiple=true)]
public class MyHtmlAttributesAttribute : System.Attribute
将它们应用为
[MyHtmlAttributes("Class", "ltr")]
[MyHtmlAttributes("AutoCompleteType", "Disabled")]
public string Email { get; set; }
当然,必须更改属性的构造函数和实现以仅允许单个attr值对,但添加/删除对应该只会更容易。通过读取属性上的所有MyHtmlAttributes实例来组合它们应该是直截了当的。