2009-07-24 35 views
22

Giả sử tôi có một số Type được gọi là type.Xác định xem loại có phải là số

Tôi muốn xác định xem tôi có thể làm điều này với loại của tôi (mà không thực sự làm điều này với từng loại):

Nếu typeSystem.Windows.Point sau đó tôi có thể làm điều này:

Point point1 = new Point(); 

Tuy nhiên nếu typeSystem.Environment thì thao tác này sẽ không hoạt động:

Environment environment1 = new Environment(); //wrong 

Vì vậy, nếu tôi lặp lại từng có thể nhìn thấy loại trong một hội đồng làm thế nào để bỏ qua tất cả các loại mà sẽ không tạo ra một ví dụ như thứ hai? Tôi là loại mới để phản ánh vì vậy tôi không phải là tuyệt vời với các thuật ngữ được nêu ra. Hy vọng rằng những gì tôi đang cố gắng làm ở đây là khá rõ ràng. Các lớp học

Trả lời

53

static được khai báo abstractsealed ở cấp IL. Vì vậy, bạn có thể kiểm tra tài sản IsAbstract để xử lý cả hai lớp abstractstatic trong một lần (đối với trường hợp sử dụng của bạn).

Tuy nhiên, abstract các lớp không phải là các loại duy nhất bạn không thể khởi tạo trực tiếp. Bạn nên kiểm tra những thứ như giao diện (without the CoClass attribute) và các loại không có hàm tạo có thể truy cập bằng mã gọi.

+3

Cảm ơn câu trả lời, tôi đã mất nhiều thời gian để tự mình làm được điều này. – Beaker

-3

Đây là cách để có được tất cả các contstuctors công cộng của tất cả các loại trong một hội đồng.

var assembly = AppDomain.CurrentDomain.GetAssemblies()[0]; // first assembly for demo purposes 
var types = assembly.GetTypes(); 
foreach (var type in types) 
{ 
    var constructors = type.GetConstructors(); 
} 
6

bạn có thể tìm kiếm contructors công cộng như thế này,

Hoặc nếu bạn chỉ quan tâm đến việc xây dựng parameterless bạn có thể sử dụng

Type t = typeof(Environment); 
var c = t.GetConstructor(Type.EmptyTypes); 
if (c != null && c.IsPublic && !t.IsAbstract) 
{ 
    //You can create instance 
} 
+2

Lưu ý rằng một lớp 'abstract' có thể có một hàm tạo' public'. Bạn không nhất thiết phải tạo một thể hiện của một lớp trong phần thân của câu lệnh 'if' của bạn. Bạn sẽ nhận được 'MemberAccessException'. –

+0

yea, bạn nói đúng, tôi đã chỉnh sửa bài đăng. –

10
type.IsAbstract && type.IsSealed 

Đây sẽ là một tấm séc đủ cho C# kể từ một lớp trừu tượng không thể được niêm phong hoặc tĩnh trong C#. Tuy nhiên, bạn cần phải cẩn thận khi xử lý các loại CLR từ các ngôn ngữ khác.

1
Type t = typeof(System.GC); 
Console.WriteLine(t.Attributes); 
TypeAttributes attribForStaticClass = TypeAttributes.AutoLayout | TypeAttributes.AnsiClass | TypeAttributes.Class | 
TypeAttributes.Public | TypeAttributes.Abstract | TypeAttributes.Sealed | TypeAttributes.BeforeFieldInit; 
Console.WriteLine((t.Attributes == attribForStaticClass)); 

Tôi đoán, điều này sẽ hiệu quả.

Các vấn đề liên quan