属性中的C#动态数组

时间:2014-04-29 11:39:48

标签: c# attributes

嗨我需要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; }
  ...
  ..
 }

谢谢你的回答

1 个答案:

答案 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实例来组合它们应该是直截了当的。