是否可以从IntPtr
类型句柄获取System.Type
对象(可以通过Type.TypeHandle.Value
获得)?
示例:
TypeFromIntPtr(typeof(object).TypeHandle.Value) == typeof(object) //true
编辑:我很高兴有许多有帮助的人认为我正在尝试解决其他问题,但我正在寻找这个特定问题的答案,我对此非常肯定。我很抱歉没有首先说明它。
编辑#2:类型句柄是指向CLR中表示RTTI的结构的指针。我不想从这个结构中读取数据,我想要一种方法来返回托管的Type
对象。我需要"转换"指向对象的指针。
答案 0 :(得分:7)
我们通常不允许任何人射击他们的脚,但你似乎坚持要你,你知道你在做什么。
以下是你射脚的方法:
private static Type GetTypeFromHandle(IntPtr handle)
{
var method = typeof(Type).GetMethod("GetTypeFromHandleUnsafe", BindingFlags.Static | BindingFlags.NonPublic);
return (Type)method.Invoke(null, new object[] { handle });
}
private static void Main(string[] args)
{
IntPtr handle = typeof(string).TypeHandle.Value;//Obtain handle somehow
Type type = GetTypeFromHandle(handle);
}
答案 1 :(得分:1)
调用内部方法的另一种方法是滥用TypedReference:
private struct TypedReferenceAccess
{
public IntPtr Value;
public IntPtr Type;
}
private static unsafe Type GetTypeFromTypeHandle(IntPtr handle)
{
TypedReferenceAccess tr = new TypedReferenceAccess()
{
Type = handle
};
return __reftype(*(TypedReference*)&tr);
}
这当然取决于TypedReference的布局,因此确实不安全。但是由于实际上不支持从TypeHandle获取Type,因此如果您确实愿意,则必须选择毒药。尽管我会说我忍不住发现本地的TypeHandle公开公开有点奇怪,但是却没有其他方向。