“是”和“IsAssignableFrom”C#之间的区别

时间:2013-07-18 14:34:59

标签: c# interface reflection

之间的区别是什么:

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

3 个答案:

答案 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检查是否可以将作为参数传递的类型的对象分配给另一种类型的变量。 关键字检查关键字左侧的对象是否可以分配给关键字右侧类型的变量。

相关问题