属性类,System.Attribute,复杂类型

时间:2016-07-21 15:58:46

标签: c#

可以使用复杂类型的字段和构造函数声明一个AttributeClass吗?

答案是:不!看到这篇文章:https://stackoverflow.com/a/38509077/2935383

向下滚动以寻找其他解决方案。

我的尝试:

拥有属性类

class Attr : System.Attribute {
    private string _author;
    private A[] _additionalParam;

    public string Author{ get { return _author; } }
    public A[] Add{ get { return _additionalParam; } }

    public Attr( string author, params A[] add ){
        _author = author;
        _additionalParam = add;
    }
}

复杂类型

class A{
    public string abc;
    public string def;

    public A( string a, string b ){
        abc = a;
        def = b;
    }
}

用法属性类

//this dosn't work
[Attr("me ;)", new A("a","b"), new A("c", "d")] 
TestClass{

}

不能使用new A("a","b"),它不是常数。

修改: 构造函数也采用复杂类型;)

我的解决方案:

我已经定义了第二个属性类并将其设置为多个。

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = false)]
class AdditionlAttr : System.Attribute
    public string abc;
    public string def;

    public AdditionlAttr( string a, string b ){
        abc = a;
        def = b;
    }
}

并更改Attr - 类

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)]
class Attr : System.Attribute {
    private string _author;

    public string Author{ get { return _author; } }

    public Attr( string author ){
        _author = author;
    }
}

用法:

[Attr("me ;)"]
[AdditionlAttr("a","b")]
[AdditionlAttr("c","d")]
TestClass{

}

1 个答案:

答案 0 :(得分:2)

不,你不能这样做。来自C# Language Specification 5.0的第17.1.3节:

  

属性类的位置和命名参数类型仅限于属性参数类型

     
      
  • 以下类型之一:boolbytechardoublefloatintlongsbyteshortstringuintulongushort
  •   
  • 类型object
  •   
  • 类型System.Type
  •   
  • 枚举类型[...]
  •   
  • 上述
  • 的一维数组   
     

没有这些类型之一的构造函数参数或公共字段不能用作属性规范中的位置参数或命名参数。