6

有什么区别:

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;
}
4

3 回答 3

14

它们看起来相似但在概念上非常不同。前者回答了“如果我有一个这种类型的变量,我可以给它分配那个类型的吗?”这个问题。

后者回答了“这个实际值是否可以通过引用或装箱转换转换为这种类型?”的问题。

在后一种情况下,实际对象是 typeType的对象,而不是 type 的对象Class。确保您了解以下之间的区别:

Type t = typeof(Class);
Class c = new Class();
bool b1 = t is IInterface;
bool b2 = c is IInterface;

第一个问“可以将Type对象转换为接口吗?” 第二个问“可以将Class对象转换为界面吗?”

于 2013-07-18T14:38:31.063 回答
2

一些区别:

A:使用 IsAssignableFrom,您不需要任何对象实例(仅 System.Type 对象),这在反射期间非常有用。

B:如果类型总是/从不兼容(至少使用 resharper),使用is关键字获得一些编译时提示

C:它们有点相反。IsAssignableFrom 检查作为参数传递的类型的对象是否可以分配给其他类型的变量。is关键字检查是否可以将关键字左侧的对象分配给关键字右侧类型的变量。

于 2013-07-18T14:40:53.167 回答
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,而在运行时检查它并没有真正的意义。

于 2013-07-18T14:41:21.433 回答