如何检查对象是否来自接口?

时间:2012-09-13 19:12:33

标签: c# interface polymorphism derived-class

我有一些派生自接口的类,我希望能够检查代码以查看传入的对象是否是从该接口派生的,但我不确定该方法是否正在调用..

interface IFile
{
}

class CreateFile : IFile
{
    string filename;
}

class DeleteFile : IFile
{
    string filename;
}

// Input here can be a string or a file
void OperateOnFileString( object obj )
{
    Type theType = obj.GetType();

    // Trying to avoid this ...
    // if(theType is CreateFile || theType is DeleteFile)

    // I dont know exactly what to check for here
    if( theType is IFile ) // its not, its 'CreateFile', or 'DeleteFile'
        print("Its an IFile interface");
    else
        print("Error: Its NOT a IFile interface");
}

实际上我有来自该接口的数百个派生类,我试图避免检查每种类型,并且在我从该类型创建另一个类时必须添加检查。

6 个答案:

答案 0 :(得分:8)

is完全正确 但是,您需要检查实例本身。

obj.GetType()返回描述对象实际类的System.Type类的实例。

你可以写if (obj is IFile)

答案 1 :(得分:5)

  1. is运算符可以正常运行:

    if (someInstance is IExampleInterface) { ... }
    
  2. if(typeof(IExampleInterface).IsAssignableFrom(type)) {
     ...
    }
    

答案 2 :(得分:3)

您将错误的参数传递给is。正确的是

if (obj is file) {
    // ...
}

然而,如果你有一个直接接受file参数的方法的重载会更好。事实上,很难理解接受object的人如何有效地使用它。

答案 3 :(得分:2)

您可以使用BaseType

if (type.BaseType is file) 

由于file是一个接口,请使用Type.GetInterfaces检查type的基础接口:

if (type.GetInterfaces().Any(i => i.Equals(typeof(file))

或者可能更快一点,使用Type.GetInterface

if (type.GetInterface(typeof(file).FullName) != null)

(这将搜索type和任何继承的类或接口的接口。)

答案 4 :(得分:2)

If( yourObject is InterfaceTest)
{
   return true;
}

答案 5 :(得分:0)

您可以创建如下所示的扩展方法

    /// <summary>
    /// Return true if two types or equal, or this type inherits from (or implements) the specified Type.
    /// Necessary since Type.IsSubclassOf returns false if they're the same type.
    /// </summary>
    public static bool IsSameOrSubclassOf(this Type t, Type other)
    {
        if (t == other)
        {
            return true;
        }
        if (other.IsInterface)
        {
            return t.GetInterface(other.Name) != null;
        }
        return t.IsSubclassOf(other);
    }

    and use it like below

    Type t = typeof(derivedFileType);
    if(t.IsSameOrSubclassOf(typeof(file)))
    { }