从IntPtr句柄输入

时间:2014-11-17 11:50:14

标签: c# .net clr

是否可以从IntPtr类型句柄获取System.Type对象(可以通过Type.TypeHandle.Value获得)?

示例:

TypeFromIntPtr(typeof(object).TypeHandle.Value) == typeof(object) //true

编辑:我很高兴有许多有帮助的人认为我正在尝试解决其他问题,但我正在寻找这个特定问题的答案,我对此非常肯定。我很抱歉没有首先说明它。

编辑#2:类型句柄是指向CLR中表示RTTI的结构的指针。我不想从这个结构中读取数据,我想要一种方法来返回托管的Type对象。我需要"转换"指向对象的指针。

2 个答案:

答案 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公开公开有点奇怪,但是却没有其他方向。