2010-04-14 30 views
6

nhiều câu hỏi gần, nhưng không có câu trả lời nào cho vấn đề của tôi ...Sử dụng phản ánh để có danh sách các lớp tĩnh

Làm cách nào để sử dụng sự phản chiếu trong C# 3.5. Tôi đã nhận được tất cả các loại được xác định, nhưng không có thuộc tính IsStatic. Việc đếm 0 hàm tạo chậm và không hoạt động.

Bất kỳ mẹo hoặc dòng mã nào? :-)

Chris

Trả lời

12

Đây là cách bạn có được các loại từ một assembly:

http://msdn.microsoft.com/en-us/library/system.reflection.assembly.aspx

GetTypes Method

Sau đó:

Hãy tìm các lớp học mà là trừu tượng và đóng dấu cùng một lúc.

http://dotneteers.net/blogs/divedeeper/archive/2008/08/04/QueryingStaticClasses.aspx

Tìm kiếm trong blog tôi có thể tìm thấy những thông tin mà .NET CLR không biết ý tưởng của các tầng lớp tĩnh, tuy nhiên cho phép sử dụng những lá cờ kiểu trừu tượng và đóng dấu cùng một lúc. Những cờ này cũng được CLR sử dụng để tối ưu hóa hành vi của nó, ví dụ lá cờ kín được sử dụng gọi các phương thức ảo của lớp kín như phi ảo. Vì vậy, để hỏi xem một loại là tĩnh hay không, bạn có thể sử dụng phương pháp này:

Từ những nhận xét dưới đây:

IEnumerable<Type> types = typeof(Foo).Assembly.GetTypes().Where 
(t => t.IsClass && t.IsSealed && t.IsAbstract); 
+1

Vì vậy, cho Kevin của câu trả lời, bạn có thể lấy các lớp như sau: 'IEnumerable loại = typeof (Foo) .Assembly.GetTypes() .Where (t => t.IsClass && t.IsSealed && t.IsAbstract); ' –

1

lớp tĩnh là một tính năng của C#, không phải là ngôn ngữ Thông số kỹ thuật chung, và do đó, không một mảnh của siêu dữ liệu về một trường hợp Loại rằng sẽ chỉ ra rằng đó là một lớp tĩnh. Tuy nhiên, bạn có thể kiểm tra xem đó có phải là loại niêm phong hay không và nếu tất cả các thành viên không được kế thừa của nó là tĩnh.

3

gì C# gọi một lớp tĩnh, là một bản tóm tắt, lớp niêm phong với CLR. Vì vậy, bạn cần phải xem xét IsAbstract & & IsSealed.

1

Bạn cần phải kết hợp các kiểm tra sau: Tóm tắt, Đã được đóng dấu, BeforeFieldInit. Sau lớp tĩnh biên dịch, bạn có thể nhìn thấy sau mã IL trong hội đồng biên soạn:

.class public abstract auto ansi sealed beforefieldinit StaticClass 
    extends [mscorlib]System.Object 
{ 
} 
Các vấn đề liên quan