It is possible do declare a AttributeClass with a filed and constructor of complex type?
The answer is: No! see this post: https://stackoverflow.com/a/38509077/2935383
Scroll down for a other solution.
My try:
Own attribute-class
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;
}
}
Complex type
class A{
public string abc;
public string def;
public A( string a, string b ){
abc = a;
def = b;
}
}
Usage attribute class
//this dosn't work
[Attr("me ;)", new A("a","b"), new A("c", "d")]
TestClass{
}
Cannot use new A("a","b")
, it is not constant.
Edit: constructor also take the complex type ;)
I've defined a second Attribute-Class and set it to multiple.
[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;
}
}
And change the Attr
-Class
[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;
}
}
Usage:
[Attr("me ;)"]
[AdditionlAttr("a","b")]
[AdditionlAttr("c","d")]
TestClass{
}
No, you can't do this. From section 17.1.3 of the C# Language Specification 5.0:
The types of positional and named parameters for an attribute class are limited to the attribute parameter types which are:
- One of the following types:
bool
,byte
,char
,double
,float
,int
,long
,sbyte
,short
,string
,uint
,ulong
,ushort
- The type
object
- The type
System.Type
- An enum type [...]
- Single-dimensional arrays of the above
A constructor argument or public field which does not have one of these types, cannot be used as a positional or named parameter in an attribute specification.
See more on this question at Stackoverflow