AFAIK, thông số được đặt tên chỉ cho phép loại tích phân. Thật không may tôi không có một tham chiếu để trở lại này, tôi chỉ học được nó thông qua thử nghiệm của riêng tôi.
Khi cố gắng sử dụng initialisers đối tượng, tôi đã nhận lỗi này từ trình biên dịch:
Một cuộc tranh cãi thuộc tính phải là một biểu thức hằng số, typeof biểu hiện hoặc tạo mảng biểu hiện của một loại tham số thuộc tính
Mặc dù điều này documentation là một vài năm tuổi, nó có thông tin tham khảo tôi đang tìm kiếm:
Thuộc tính p arameters bị hạn chế giá trị không đổi của loại sau đây:
- loại đơn giản (bool, byte, char, short, int, long, float, và đôi)
- chuỗi
- System.Type
- enums
- đối tượng (Đối số tham số thuộc tính của đối tượng kiểu phải là giá trị không đổi của một trong các loại ở trên.) Một chiều mảng của bất kỳ của các loại trên
Vì vậy, công trình này:
//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
Trong khi điều này sẽ không:
//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: chỉ để xây dựng, các thuộc tính tạo thành một phần của siêu dữ liệu cho các cấu trúc mà chúng được áp dụng cho (trong IL được tạo), do đó các thành viên của lớp thuộc tính phải được xác định tại thời gian biên dịch; do đó hạn chế về tham số thuộc tính đối với các giá trị không đổi.
Nguồn
2012-01-18 22:02:33
Tôi đã đặt trình khởi tạo 'string []' vào một thuộc tính. – JohnL