2008-10-21 4 views
8

Это мой первый вопрос, поэтому я надеюсь, что смогу его четко сформулировать и, надеюсь, он не будет слишком ослепительно легким.BaseType базового типа

У меня есть следующий класс SubSim который проходит Sim, который простирающуюся MainSim. В совершенно отдельном классе (и в библиотеке) мне нужно проверить, прошел ли объект, проходящий через него, тип MainSim. Поэтому для проверки проверяется следующее:

 
Type t = GetType(sim); 
//in this case, sim = SubSim 
if (t != null) 
{ 
    return t.BaseType == typeof(MainSim); 
} 

Очевидно t.BaseType собирается вернуть Sim так Type.BaseType получает тип, от которого текущий тип непосредственно наследуется.

Короткие того, чтобы сделать t.BaseType.BaseType получить MainSub, есть ли другой способ, чтобы получить нужный тип с помощью библиотеки .NET? Или есть переопределения, которые можно переопределить, чтобы вернуть основной класс?

Спасибо заранее

ответ

17

Есть 4 связанные стандартные способы:

sim is MainSim; 
(sim as MainSim) != null; 
sim.GetType().IsSubclassOf(typeof(MainSim)); 
typeof(MainSim).IsAssignableFrom(sim.GetType()); 

Вы также можете создать рекурсивный метод:

bool IsMainSimType(Type t) 
{ if (t == typeof(MainSim)) return true; 
    if (t == typeof(object)) return false; 
    return IsMainSimType(t.BaseType); 
} 
+0

Мне нравится этот рекурсивный метод, и я думаю, что попробую это вместо моего решения. Спасибо! – 2008-10-21 17:11:30

10
if (sim is MainSim) 

все, что вам нужно. «is» просматривает дерево наследования.

1

'есть' вариант не работает для меня. Это предостерегло меня; «Данное выражение никогда не относится к предоставленному (« MainSim ») типу», однако я верю, что предупреждение больше касалось рамки, которую мы имеем. Мое решение закончилось тем, что было:

return t.BaseType == typeof(MainSim) || t.BaseType.IsSubclassof(typeof(MainSim));

Не так чисто, как я надеялся, или так же просто, как и ваши ответы. Независимо, спасибо всем за ваши ответы. Простота их заставляет меня понять, что мне нужно многому научиться.

+0

Вы, вероятно, сделали «return t is MainSim» вместо «return sim is MainSim». – Hallgrim 2008-10-21 16:03:19

Смежные вопросы