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

3

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

也就是说,当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;
}
1个回答

7
你可以使用Type.IsAssignableFrom,例如。
public class Foo { }

public class Bar : Foo { }

...

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

FooBar是类型 - 我需要比较实例的类型,例如 var foo == new Foo(); Type bar = typeof(someType); ... foo是否与bar兼容? - Jamie Treworgy
如果您无法表达强制转换或比较(例如 if (someInstance is Foo)Foo checkInstance = someInstance as Foo),则需要获取类型。因此,在上面的示例中,您需要检查 foo.GetType() 并将其与 IsAssignableFrom 一起使用。 - Matthew Abbott

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接