如何确定一个类型是否是RunTimeType类型?我有一个能够工作但有些笨拙的方法:
private bool IsTypeOfType(Type type)
{
return type.FullName == "System.RuntimeType";
}
如何确定一个类型是否是RunTimeType类型?我有一个能够工作但有些笨拙的方法:
private bool IsTypeOfType(Type type)
{
return type.FullName == "System.RuntimeType";
}
Type
对象是否描述了Type
类,但是Type
对象是typeof(RuntimeType)
而不是typeof(Type)
,因此将其与typeof(Type)
进行比较会失败。Type
对象描述的类型的实例是否可以分配给Type
类型的变量。这样可以得到所需的结果,因为RuntimeType
派生自Type
。private bool IsTypeOfType(Type type)
{
return typeof(Type).IsAssignableFrom(type);
}
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
IsTypeOfType()
不会总是返回 true
吗? - svicknew {}.GetType()
呢?我已经尝试过了,结果是false
(而应该是true),这意味着它是错误的。在.NET 4.5中,我们有TypeInfo
,看起来检查type is TypeInfo
似乎可以用来检查t的运行时类型是否正确。 - Hopeless实际上,唯一的麻烦是 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 Fiddle 链接。
object is a System.Type
,如果你传入new {}.GetType()
,那么new {}
应该是一个运行时类型,所以为了使用IsRuntimeType
方法(由dtb
提供),我们需要通过使用GetType
(或任何其他可能的方式?)来获取它的Type
,然后再检查new {}
是否是运行时类型。为什么要在IsRuntimeType
中传递new {}.GetType().GetType()
?那会检查Type
本身(即Type
的类型),而不是对象类型(即new {}
的类型)。 - Hopelessnew { }.GetType().ToString()
,我们会得到 <>f__AnonymousType0
。为什么您说 new {}
应该是运行时类型?我认为这不是这种情况——它不是匿名类型吗?因此有了这段代码。 - alelomIsRuntimeType()
中,如果你传入 new {}.GetType()
,它会打印 object is a System.Type(这是一个匿名类型);如果你传入 new {}.GetType().GetType()
,它会打印 object is a System.RuntimeType。 - alelomSystem.RuntimeType
存在误解,它实际上只是从Type
派生的类型,用于表示类型的类型(我不确定System.RuntimeType
的实例是如何创建的,但也许一种方式是在Type
上调用GetType()
)。我认为它是关于所有动态创建的类型的通用术语(这再次让我与匿名类型混淆,尽管匿名类型仍然是编译时创建的类型-它们只是被隐藏并由编译器自动生成)。因此,要测试IsRuntimeType
,我们需要在运行时创建一些类型(也许使用反射发射)。 - HopelessGetType
返回System.RuntimeType
。 - Hopelessreturn type == typeof(MyObjectType) || isoftype(type.BaseType) ;
RuntimeType
是internal
。 - svick