Gần đây tôi đã đọc về các thuộc tính và phản chiếu và tôi nghĩ đó sẽ là một phương pháp tốt để bao gồm siêu dữ liệu trong chương trình của tôi. Tôi có lớp trừu tượng này và tôi muốn tất cả các lớp thừa hưởng từ nó để khai báo với lớp một số thuộc tính, vì tôi muốn các thành phần tùy chỉnh (các lớp dẫn xuất) được tạo cho chương trình của tôi và muốn đọc siêu dữ liệu của các lớp này trong thời gian chạy. Tuy nhiên, các lớp dẫn xuất tất cả đều phải khai báo rõ ràng thuộc tính trong đó tôi lưu trữ siêu dữ liệu. Vì vậy, làm thế nào để tôi buộc một tuyên bố thuộc tính trong các lớp học có nguồn gốc? Cảm ơn.Tuyên bố thuộc tính lực trong các lớp có nguồn gốc
Trả lời
Xác định lớp thuộc tính của bạn để có thuộc tính AttributeUsageAttribute
trong đó thuộc tính Inherited
là true
.
Hoặc không, vì đó là mặc định ...
mục tiêu nguồn gốc (có nghĩa là, các lớp học nếu các thuộc tính là trên một lớp, phương pháp nếu nó là trên một phương pháp, vv) sau đó sẽ kế thừa thuộc tính mà không khai báo rõ ràng. Tuy nhiên,
Nếu bằng "lực lượng", nghĩa là "thực thi thời gian biên dịch": Bạn không thể.
Như Daniel đã nói, bạn không thể thực thi các thuộc tính lúc biên dịch.
Nhưng nếu bạn muốn đọc dữ liệu trong thời gian chạy, tại sao phải bận tâm với thuộc tính và phản ánh? Bạn có thể tạo phương thức trừu tượng trong lớp trừu tượng của mình:
abstract class Base
{
public abstract string Metadata();
}
class Derived1 : Base
{
public override string Metadata()
{
return "Metadata for Derived1";
}
}
class Derived2 : Base // won't compile, since Metadata has not been provided
{
}
Hành vi này hơi khác, tất nhiên. Với tùy chọn này, bạn cần tham chiếu đến cá thể của lớp dẫn xuất thay vì chỉ thông tin kiểu. Mặt khác, nó tránh sự phản chiếu.
Như Daniel nói bạn không thể ép buộc lúc biên dịch. Bạn có thể thêm (các) thuộc tính cho phụ huynh trừu tượng và chọn chúng.
Tùy chọn khác là thêm phương thức để kiểm tra sự tồn tại của thuộc tính trong lớp cha và ném ngoại lệ nếu không có. Gọi đó là từ các phương pháp phù hợp.
tuyệt vời! cảm ơn. – irisjay