我有一些派生自接口的类,我希望能够检查代码以查看传入的对象是否是从该接口派生的,但我不确定该方法是否正在调用..
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");
}
实际上我有来自该接口的数百个派生类,我试图避免检查每种类型,并且在我从该类型创建另一个类时必须添加检查。
答案 0 :(得分:8)
is
完全正确
但是,您需要检查实例本身。
obj.GetType()
返回描述对象实际类的System.Type
类的实例。
你可以写if (obj is IFile)
。
答案 1 :(得分:5)
is
运算符可以正常运行:
if (someInstance is IExampleInterface) { ... }
和
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)))
{ }