gpt4 book ai didi

c# - 为什么 TypedReference.MakeTypedReference 如此受限?

转载 作者:太空宇宙 更新时间:2023-11-03 10:37:41 25 4
gpt4 key购买 nike

我终于明白了 TypedReference.MakeTypedReference 的用法了方法,但为什么论点如此有限?底层的 private InternalMakeTypedReference(void* result, object target, IntPtr[] flds, RuntimeType lastFieldType) 比限制字段数组的 MakeTypedReference 可以做更多的事情元素和字段类型是非原始的。

我制作了一个示例使用代码,展示了它的全部可能性:

private static readonly MethodInfo InternalMakeTypedReferenceMethod = typeof(TypedReference).GetMethod("InternalMakeTypedReference", flags);
private static readonly Type InternalMakeTypedReferenceDelegateType = ReflectionTools.NewCustomDelegateType(InternalMakeTypedReferenceMethod.ReturnType, InternalMakeTypedReferenceMethod.GetParameters().Select(p => p.ParameterType).ToArray());
private static readonly Delegate InternalMakeTypedReference = Delegate.CreateDelegate(InternalMakeTypedReferenceDelegateType, InternalMakeTypedReferenceMethod);

public static void MakeTypedReference([Out]TypedReference* result, object target, params FieldInfo[] fields)
{
IntPtr ptr = (IntPtr)result;
IntPtr[] flds = new IntPtr[fields.Length];
Type lastType = target.GetType();
for(int i = 0; i < fields.Length; i++)
{
var field = fields[i];
if(field.IsStatic)
{
throw new ArgumentException("Field cannot be static.", "fields");
}
flds[i] = field.FieldHandle.Value;
lastType = field.FieldType;
}
InternalMakeTypedReference.DynamicInvoke(ptr, target, flds, lastType);
}

不幸的是,实际调用它需要更多的 hack,因为它不能从 MethodInfo 调用并且一个参数是 RuntimeType,因此必须动态生成委托(delegate)类型(也可以使用DynamicMethod)。

现在这能做什么?它可以不受限制地访问任何对象的任何值的任何字段(类或结构类型,甚至原始类型)。此外,它可以创建对装箱值类型的引用。

object a = 98;
TypedReference tr;
InteropTools.MakeTypedReference(&tr, a);
Console.WriteLine(__refvalue(tr, int)); //98
__refvalue(tr, int) = 1;
Console.WriteLine(a); //1

那么为什么开发人员看似愚蠢地决定禁止这种用法,而这显然很有用呢?

最佳答案

Plato和他该死的“类型理论”……

它是任何 ref(托管指针)引用的固有特性——包括新的 C# 7 ref local and ref return功能——如您所见,TypedReference ,您可以将其用于目标的阅读写作。因为这不是重点吗?

现在因为 CTS不能排除这两种可能性,强类型要求每个 refType 都受到 above类型层次结构中。

更正式地说,Type 被限制为多态 covariance and contravariance交集否则它有资格获得。显然,这个交集的结果折叠成一个单一的 Type,它本身从此是不变的。

关于c# - 为什么 TypedReference.MakeTypedReference 如此受限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26998758/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com