如何确定 Type 是否属于 RunTimeType 类型?我有这个工作,但它有点笨拙:
private bool IsTypeOfType(Type type)
{
return type.FullName == "System.RuntimeType";
}
如何确定 Type 是否属于 RunTimeType 类型?我有这个工作,但它有点笨拙:
private bool IsTypeOfType(Type type)
{
return type.FullName == "System.RuntimeType";
}
我猜您实际上想知道一个Type
对象是否描述了Type
该类,但是该Type
对象是typeof(RuntimeType)
不是typeof(Type)
,因此将其与它进行比较typeof(Type)
失败。
您可以做的是检查Type
对象描述的类型的实例是否可以分配给 type 的变量Type
。这给出了预期的结果,因为RuntimeType
源自Type
:
private bool IsTypeOfType(Type type)
{
return typeof(Type).IsAssignableFrom(type);
}
如果确实需要知道Type
描述Type
类的对象,可以使用GetType方法:
private bool IsRuntimeType(Type type)
{
return type == typeof(Type).GetType();
}
但是,因为typeof(Type) != typeof(Type).GetType()
,您应该避免这种情况。
例子:
IsTypeOfType(typeof(Type)) // true
IsTypeOfType(typeof(Type).GetType()) // true
IsTypeOfType(typeof(string)) // false
IsTypeOfType(typeof(int)) // false
IsRuntimeType(typeof(Type)) // false
IsRuntimeType(typeof(Type).GetType()) // true
IsRuntimeType(typeof(string)) // false
IsRuntimeType(typeof(int)) // false
真的,唯一的麻烦是System.RuntimeType
,internal
所以做一些简单的事情,比如:
if (obj is System.RuntimeType)
不编译:
CS0122 'RuntimeType' 由于其保护级别而无法访问。
所以上面@dtb 的解决方案是正确的。扩展他们的答案:
void Main()
{
object obj = "";
// obj = new {}; // also works
// This works
IsRuntimeType(obj.GetType()); // Rightly prints "it's a System.Type"
IsRuntimeType(obj.GetType().GetType()); // Rightly prints "it's a System.RuntimeType"
// This proves that @Hopeless' comment to the accepted answer from @dtb does not work
IsWhatSystemType(obj.GetType()); // Should return "is a Type", but doesn't
IsWhatSystemType(obj.GetType().GetType());
}
// This works
void IsRuntimeType(object obj)
{
if (obj == typeof(Type).GetType())
// Can't do `obj is System.RuntimeType` -- inaccessible due to its protection level
Console.WriteLine("object is a System.RuntimeType");
else if (obj is Type)
Console.WriteLine("object is a System.Type");
}
// This proves that @Hopeless' comment to the accepted answer from @dtb does not work
void IsWhatSystemType(object obj)
{
if (obj is TypeInfo)
Console.WriteLine("object is a System.RuntimeType");
else
Console.WriteLine("object is a Type");
}
在这里工作.NET 小提琴。
return type == typeof(MyObjectType) || isoftype(type.BaseType) ;