在运行时检查对象类型兼容性

时间:2011-03-11 13:50:31

标签: c# types

这是一个相当普遍的问题,但我正在做的具体事情很简单,所以我要包含代码。当我在编译时不知道两种对象的类型时,如何检查两个对象之间的类型兼容性?

也就是说,当if (object is SomeType)是编译时已知的类型名称时,我可以SomeTypeGetType()是不够的,因为它不适用于派生类型。基本上我希望能够说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;
}

1 个答案:

答案 0 :(得分:7)

您可以使用Type.IsAssignableFrom例如

public class Foo { }

public class Bar : Foo { }

...

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