工作集类型引用

本文关键字:引用 类型 工作集 | 更新日期: 2023-09-27 18:30:22

在文档中,我看到TypedReference.SetTypedReference(target, value)不受支持。

  1. 此方法是否旨在表示与类型无关的等效__refvalue(target, T) = value

  2. 为什么决定不支持此方法?我想知道为什么首先选择在那里声明未实现的方法。

  3. 有没有相当于__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 实例化的泛型方法来使用它们来执行您想要的操作。