- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我终于明白了 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不能排除这两种可能性,强类型要求每个 ref
的 Type
都受到 above 和 在类型层次结构中。
更正式地说,Type
被限制为多态 covariance and contravariance 的交集否则它有资格获得。显然,这个交集的结果折叠成一个单一的 Type
,它本身从此是不变的。
关于c# - 为什么 TypedReference.MakeTypedReference 如此受限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26998758/
TypedReference 有什么实际用途吗?您实际会在实际代码中使用的结构? 编辑:.Net 框架在 Console.WriteLine 和 String.Concat 的重载中使用它们,它们从
我终于明白了 TypedReference.MakeTypedReference 的用法了方法,但为什么论点如此有限?底层的 private InternalMakeTypedReference(vo
我想假设这个问题的目的是检查是否至少有一种方法,即使是通过最不安全的 hack,来保持对非 blittable 值类型的引用。我知道这种设计类型堪比犯罪;除了学习之外,我不会在任何实际情况下使用它。所
警告:这个问题有点邪门……信教的程序员一向恪守优良作法,请勿阅读。 :) 有谁知道为什么使用TypedReference如此气馁(隐含地,由于缺乏文档)? 我发现它有很好的用途,例如当通过不应该是通用
我有以下示例代码: string a = "1"; int b = 0; TypedReference tr = __makeref(b); Int32.TryParse(a, out __refva
我是一名优秀的程序员,十分优秀!