之间的区别是什么:
typeof(IInterface).IsAssignableFrom(typeof(Class));
和
typeof(Class) is IInterface
编辑:对于上下文,我的函数是这样的:
public static List<T> GetAllInstancesOfType<T>() where T:Entity
{
List<T> l = new List<T>();
if (typeof(IMyInterface).IsAssignableFrom(typeof(T)) //or (typeof(T) is IMyInterface)
foreach(Entity e in List1) if (e is T) l.Add(e as T);
else foreach (Entity e in List2) if (e is T) l.Add(e as T);
return l;
}
答案 0 :(得分:13)
它们外观相似但概念上非常不同。前者回答了问题“如果我有这种类型的变量,我可以为其分配该类型的值吗?”
后者回答问题“这个实际值可以通过引用或装箱转换转换为此类型吗?”
在后一种情况下,实际对象是Type
类型的对象,而不是类型Class
的对象。确保您了解:
Type t = typeof(Class);
Class c = new Class();
bool b1 = t is IInterface;
bool b2 = c is IInterface;
第一个问“可以将Type
对象转换为接口吗?”第二个问“可以将Class
对象转换为接口吗?”
答案 1 :(得分:1)
typeof(Class) is IInterface
将始终评估为false
,因为typeof(Class)
的类型为RuntimeType
。正确的使用方法是在给定类的实例上,例如
Class c = // something
bool isIt = c is IInterface;
当您想知道某个值是否可以转换为编译时已知的类型时,应该使用 is
。
IsAssignableFrom
。例如。 someType.IsAssignableFrom(someOtherType)
。如果两种类型在编译时都是已知的,例如typeof(IInterface).IsAssignableFrom(typeof(Class));
,您可以通过查找Class
的定义来了解答案,并且在运行时检查它是没有意义的。
答案 2 :(得分:0)
一些差异:
答:使用IsAssignableFrom,您不需要任何对象实例(仅限System.Type对象),这在反射过程中非常有用。
B:使用是关键字获取一些编译时提示,如果类型总是/从不兼容(至少与resharper一起)
C:他们是对立面。 IsAssignableFrom检查是否可以将作为参数传递的类型的对象分配给另一种类型的变量。 是关键字检查关键字左侧的对象是否可以分配给关键字右侧类型的变量。