2010-03-09 34 views
9

Có cách nào đơn giản để kiểm tra loại đối tượng không? Tôi cần điều gì đó dọc theo các dòng sau:Làm cách nào để kiểm tra loại đối tượng trong C++/CLI?

MyObject^ mo = gcnew MyObject(); 
Object^ o = mo; 

if(o->GetType() == MyObject) 
{ 
    // Do somethine with the object 
} 
else 
{ 
    // Try something else 
} 

Hiện tại tôi đang sử dụng các khối thử lồng nhau đang tìm kiếm System::InvalidCastException s cảm thấy xấu xí nhưng hoạt động. Tôi sẽ cố gắng và hồ sơ một cái gì đó giống như mã ở trên để xem nếu nó là bất kỳ nhanh hơn/chậm/có thể đọc được nhưng không thể làm việc ra cú pháp để thậm chí thử.

Trong trường hợp ai đó tự hỏi, điều này xuất phát từ việc có một hàng đợi duy nhất nhập một chuỗi cung cấp dữ liệu để hoạt động. Thỉnh thoảng tôi muốn thay đổi cài đặt và chuyển chúng qua hàng đợi dữ liệu là một cách đơn giản để làm như vậy.

Trả lời

24

Bạn có thể sử dụng MyObject::typeid trong C++/CLI theo cách tương tự như typeof(MyObject) được sử dụng trong C#. Mã dưới đây được sao chép một cách không biết xấu từ câu hỏi của bạn và sửa đổi ...

MyObject^ mo = gcnew MyObject(); 
Object^ o = mo; 

if(o->GetType() == MyObject::typeid) 
{ 
    // Do somethine with the object 
} 
else 
{ 
    // Try something else 
} 
+0

+ 1/Chấp nhận: Điều đó hoàn hảo - cảm ơn! –

+0

hiện tại vẫn hoạt động trong VS 2010/2012? Không thấy thành viên đó ... – bbqchickenrobot

+1

Nó vẫn hoạt động trong VS2010. Tôi không có VS2012 vì vậy không thể bình luận về phiên bản VS mới nhất. Nó có thể là bạn không phải là "nhìn thấy thành viên typeid" bởi vì autocomplete cho C + +/CLI không được bao gồm trong VS2010. – mcdave

9

Bạn nên kiểm tra How to: Implement is and as C# Keywords in C++:

chủ đề này cho thấy làm thế nào để thực hiện các chức năng của là và như C# từ khóa trong Visual C++.

+0

Có cách nào để làm điều đó với Generics thay vì mẫu để phương pháp này có thể được sử dụng trong hội đồng bên ngoài? –

0

chỉnh sửa: Tôi sẽ bỏ điều này tại đây. Nhưng câu trả lời này là dành cho C++. Có lẽ thậm chí không liên quan chút gì đến việc thực hiện điều này cho CLI.

Bạn cần biên dịch với RTTI (Thông tin loại thời gian chạy). Sau đó, xem bài viết wikipedia http://en.wikipedia.org/wiki/Run-time_type_information và tìm kiếm google cho RTTI. Nên làm việc cho bạn.

Mặt khác, bạn có thể muốn có một lớp cơ sở ảo cho tất cả các lớp dữ liệu của bạn với biến thành viên mô tả loại đó là gì.

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