C# 从IntPtr句柄键入
是否可以从IntPtr类型句柄获取对象,该句柄可以通过以下方式获取: 例如:C# 从IntPtr句柄键入,c#,.net,clr,C#,.net,Clr,是否可以从IntPtr类型句柄获取对象,该句柄可以通过以下方式获取: 例如: TypeFromIntPtr(typeof(object).TypeHandle.Value) == typeof(object) //true 编辑:我很高兴有很多乐于助人的人认为我在尝试解决其他问题,但我正在寻找这个特定问题的答案,对此我非常确定。很抱歉,我一开始没有具体说明 编辑2:类型句柄是指向CLR中表示RTTI的结构的指针。我不想从这个结构中读取数据,我想要一种返回这个结构的托管类型对象的方法。我需要将指
TypeFromIntPtr(typeof(object).TypeHandle.Value) == typeof(object) //true
编辑:我很高兴有很多乐于助人的人认为我在尝试解决其他问题,但我正在寻找这个特定问题的答案,对此我非常确定。很抱歉,我一开始没有具体说明
编辑2:类型句柄是指向CLR中表示RTTI的结构的指针。我不想从这个结构中读取数据,我想要一种返回这个结构的托管类型对象的方法。我需要将指针转换为对象。我们通常不允许任何人射中他们的脚,但你似乎坚持你需要这样做,你知道你在做什么 以下是你如何射中你的脚:
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);
}
我们通常不允许任何人射杀他们的脚,但你似乎坚持你需要这样做,而且你知道你在做什么 以下是你如何射中你的脚:
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);
}
调用内部方法的另一种方法是滥用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获取类型实际上是不受支持的,如果你真的想,你必须选择你的毒药。尽管我不得不说,我发现本机TypeHandle被公开,但却没有任何其他方法,这有点奇怪。调用内部方法的另一种方法是滥用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获取类型实际上是不受支持的,如果你真的想,你必须选择你的毒药。尽管我不得不说,我发现本地类型句柄公开,但却没有任何其他方法,这有点奇怪。@YuvalItzchakov当然。将表示类型句柄的IntPtr转换为System.type实例。我想我已经说清楚了。@SriramSakthivel我正试图解决这个特殊的问题。你能理解我们为什么一次又一次地问你吗?我强烈怀疑你有不同的问题,你正在制造另一个问题。IntPtr从何而来?@YuvalItzchakov我必须有理由需要解决这个问题吗?我只想找到这个问题的答案,而不是别的。@YuvalItzchakov当然。将表示类型句柄的IntPtr转换为System.type实例。我想我已经说清楚了。@SriramSakthivel我正试图解决这个特殊的问题。你能理解我们为什么一次又一次地问你吗?我强烈怀疑你有不同的问题,你正在制造另一个问题。IntPtr从何而来?@YuvalItzchakov我必须有理由需要解决这个问题吗?我只寻求这个特定问题的答案,没有其他问题。谢谢!这正是我想要的。我搜索了打字课,但一定没找到。谢谢!这正是我想要的。我搜索了Type类,但肯定没找到。