应用C#属性时允许使用什么语法
本文关键字:许使用 什么 语法 属性 应用 | 更新日期: 2023-09-27 18:20:37
到目前为止,这些是我见过的最常见也是唯一的模式:
[AttributeFoo]
[AttributeBar("Hello world!")]
[AttributeBaz(foo=42,bar="Hello world!")]
public class Example {}
属性语法看起来像您正在调用构造函数的。在C#支持可选参数和命名参数之前,属性的命名参数是唯一可见的区别。
C#编译器允许其他操作吗?像params
参数或对象/集合初始值设定项?
另请参阅:在MSDN 上应用属性
除了其他人所说的,我想指出的是,属性也可以用逗号分隔。
[AttributeFoo, AttributeBar("Hello world!"), AttributeBaz(foo=42,bar="Hello world!")]
public class Example {}
AFAIK,命名参数只允许积分类型。不幸的是,我没有参考资料来支持这一点,我只是通过自己的实验才学会的。
当尝试使用对象初始化程序时,我从编译器中得到了以下错误:
属性参数必须是属性参数类型的常量表达式、typeof表达式或数组创建表达式
尽管这份文档已经有几年的历史了,但它有我想要的参考信息:
属性参数被限制为以下类型:
- 简单类型(bool、byte、char、short、int、long、float和double)
- 字符串
- 系统类型
- 枚举
- object(object类型的属性参数的参数必须是上述类型之一的常数值。)一维上述任何类型的数组
所以这是有效的:
//Test attribute class
[AttributeUsage(AttributeTargets.All)]
internal class TestAttribute : Attribute
{
public int[] Something { get; set; }
}
//Using an array initialiser - an array of integers
[TestAttribute(Something = new int[]{1, 2, 3, 4, 5})]
public abstract class Something
而这不会:
//Test person class
internal class Person
{
public string Name { get; set; }
public Person(string name)
{
this.Name = name;
}
}
//Test attribute class
[AttributeUsage(AttributeTargets.All)]
internal class TestAttribute : Attribute
{
public IEnumerable<Person> Something { get; set; }
}
//This won't work as Person is not an integral type
[TestAttribute(Something = new Person[]{new Person("James")})]
EDIT:只是为了详细说明,属性构成了它们所应用的构造的元数据的一部分(在生成的IL中),因此属性类的成员必须在编译时确定;因此将属性参数限制为常数值。
位置参数是必需的,并且必须位于任何命名参数之前;它们对应于属性的构造函数之一的参数。命名参数是可选的,与属性的读/写属性相对应。在C++、C#和J#中,为每个可选参数指定name=value,其中name是属性的名称。在Visual Basic中,指定名称:=值。
从您提供的链接。看起来这些是唯一允许的东西。基本上,正如您所提到的,您将构造函数与嵌入式属性初始化逻辑相结合。