2010-03-09 14 views
9

Czy istnieje prosty sposób sprawdzenia typu obiektu? Muszę coś wzdłuż następujące wiersze:Jak sprawdzić typ obiektu w C++/CLI?

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

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

Obecnie używam zagnieżdżonych bloków try-catch szukają System::InvalidCastException s który czuje brzydki, ale działa. Miałem zamiar wypróbować profil podobny do powyższego kodu, aby sprawdzić, czy jest szybszy/wolniejszy/czytelny, ale nie może wypróbować składni, aby spróbować.

W przypadku, gdy ktoś się zastanawia, chodzi o to, że pojedyncza kolejka wchodzi w wątek, który dostarczył dane do pracy. Czasami chcę zmienić ustawienia i przekazywanie ich za pośrednictwem kolejki danych jest prostym sposobem na zrobienie tego.

Odpowiedz

24

Możesz użyć MyObject::typeid w C++/CLI w taki sam sposób, jak typeof(MyObject) używany w języku C#. Kod poniżej bezczelnie skopiowane z pytaniem i modyfikowane ...

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

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

+ 1/Accept: To jest idealne - dzięki! –

+0

czy to nadal działa w VS 2010/2012? Nie widząc tego typowego członka ... – bbqchickenrobot

+1

Nadal działa w VS2010. Nie mam VS2012, więc nie mogę komentować najnowszej wersji VS. Możliwe, że nie "widzisz tego typu członka", ponieważ autouzupełnianie dla C++/CLI nie było zawarte w VS2010. – mcdave

9

Powinieneś sprawdzić How to: Implement is and as C# Keywords in C++:

Ten wątek pokazuje jak zaimplementować funkcjonalność IS i jak C# słów kluczowych w Visual C++.

+0

Czy istnieje sposób, aby to zrobić z rodzajowych zamiast szablonów tak, że metoda ta może być stosowana w zespołach zewnętrznych? –

0

edytuj: Zostawię to tutaj. Ale ta odpowiedź dotyczy C++. Prawdopodobnie nie jest to nawet związane z robieniem tego dla CLI.

Należy skompilować z RTTI (informacja o czasie pracy). Następnie spójrz na artykuł wikipedia http://en.wikipedia.org/wiki/Run-time_type_information i wyszukaj google dla RTTI. Powinien pracować dla ciebie.

Z drugiej strony możesz chcieć mieć wirtualną klasę bazową dla wszystkich swoich klas danych ze zmienną składową opisującą, jaki to jest.