2011-03-11 50 views
2

這是一個相當普遍的問題,但我所做的具體事情很簡單,所以我包含代碼。當我不知道編譯時的類型時,如何檢查兩個對象之間的類型兼容性?在運行時檢查對象類型兼容性

也就是說,當SomeType是編譯時已知的類型名稱時,我可以做if (object is SomeType)GetType()是不夠的,因爲它不適用於派生類型。基本上我想能夠說,if (object.IsTypeOfOrIsDerivedFrom(someType))這個神奇的方法的信號是IsTypeOfOrIsDerivedFrom(Type type)

這裏是上下文。

// Return all controls that are (or are derived from) any of a list of Types 
public static IEnumerable<Control> FindControls(this Control control, IEnumerable<Type> types, bool recurse) 
{ 
    foreach (Control ctl in control.Controls) 
    { 
     /// How can I compare the base types of item & ctl? 
     if (types.Any(item=> ....)) 
     { 
      yield return (ctl); 
     } 
     if (recurse && ctl.Controls.Count > 0) 
     { 
      IEnumerable<Control> subCtl = ctl.FindControls(types,true); 
      if (subCtl != null) 
      { 
       yield return (subCtl); 
      } 
     } 
    } 
    yield break; 
} 

回答

6

您可以使用Type.IsAssignableFrom例如,

public class Foo { } 

public class Bar : Foo { } 

... 

bool compatible = typeof(Foo).IsAssignableFrom(typeof(Bar)); 
+0

'Foo'和'Bar'是類型 - 我需要比較實例的類型,例如, 'var foo == new Foo(); type bar = typeof(someType);'...是'foo'類型與'bar'兼容嗎? – 2011-03-11 14:00:37

+0

如果您無法表達演員或比較(例如'if(someInstance is Foo)'或'Foo checkInstance = someInstance as Foo'),則需要獲取類型。因此,在上面的示例中,您需要檢查foo.GetType()並將其與'IsAssignableFrom'一起使用。 – 2011-03-11 16:10:37