这是一个比较普遍的问题,但我要做的具体事情很简单,所以我包含了代码。当我不知道编译时两个对象的类型时,如何检查两个对象间的类型兼容性?
也就是说,当SomeType
是在编译时已知的类型名称时,可以使用 if (object is SomeType)
。但是GetType()
是不够的,因为它无法与派生类型一起使用。基本上,我想能够说,“如果(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;
}
Foo
和Bar
是类型 - 我需要比较实例的类型,例如var foo == new Foo(); Type bar = typeof(someType);
...foo
是否与bar
兼容? - Jamie Treworgyif (someInstance is Foo)
或Foo checkInstance = someInstance as Foo
),则需要获取类型。因此,在上面的示例中,您需要检查foo.GetType()
并将其与IsAssignableFrom
一起使用。 - Matthew Abbott