工作集类型引用
本文关键字:引用 类型 工作集 | 更新日期: 2023-09-27 18:30:22
在文档中,我看到TypedReference.SetTypedReference(target, value)
不受支持。
-
此方法是否旨在表示与类型无关的等效
__refvalue(target, T) = value
? -
为什么决定不支持此方法?我想知道为什么首先选择在那里声明未实现的方法。
-
有没有相当于
__refvalue(target, T) = value
,就像__refvalue(value, T)
有TypedReference.ToObject(value)
一样?
编辑:对于第三个问题,我创建了以下代码:
public static class TypedReferenceConvert
{
delegate void TypedReferenceSet(TypedReference tr, object value);
static readonly Type thisType = typeof(TypedReferenceConvert);
static readonly Type TypedReferenceSet_t = typeof(TypedReferenceSet);
static readonly MethodInfo SetTypedReference_m = thisType.GetMethod("SetTypedReference", BindingFlags.NonPublic | BindingFlags.Static);
static readonly Dictionary<Type,TypedReferenceSet> setcache = new Dictionary<Type,TypedReferenceSet>();
public static void SetValue(this TypedReference target, object value)
{
TypedReferenceSet set;
Type t = __reftype(target);
if(!setcache.TryGetValue(t, out set))
{
lock(setcache)
set = setcache[t] = (TypedReferenceSet)Delegate.CreateDelegate(TypedReferenceSet_t, SetTypedReference_m.MakeGenericMethod(t));
}
set(target, value);
}
private static void SetTypedReference<T>(TypedReference target, object value)
{
__refvalue(target, T) = (T)value;
}
public static object GetValue(this TypedReference target)
{
return TypedReference.ToObject(target);
}
}
它比依赖于类型的__refvalue
慢,但我认为没有更好的解决方案。
您链接到的文档顶部有一个选项,用于切换到旧版本的 .NET Framework 的文档,包括 1.1,内容如下:
返回值
此方法将值分配给目标。值的更改类型将其转换为类型引用的类型。Convert.ChangeType 方法执行转换。
这应该回答你的第一个问题。
对于第二个问题,它最初已实现,但在 .NET 2.0 中被删除。.NET 2.0 的文档确实将其显示为已实现,但这是文档中的错误(如您所发现的,自修复以来)。
至于为什么它被删除,这有点猜测,但我怀疑这可以与你的第三个问题结合起来:TypedReference
的唯一预期用例是变量参数函数,这不需要对引用的值进行任何修改。.NET 2.0 添加的 .NET 1.1 没有的大事是泛型,这也摆脱了大多数意外用例(编写避免值类型装箱的类型泛型代码),所以我认为实现SetTypedReference
根本没有多大意义。现在您有了泛型,您可以通过调用使用 T
实例化的泛型方法来使用它们来执行您想要的操作。