Рабочий SetTypedReference

1

В документации я вижу, что TypedReference.SetTypedReference(target, value) не поддерживается.

  1. Был ли этот метод предназначен для представления независимого от типа эквивалента __refvalue(target, T) = value?

  2. Почему этот метод решил не поддерживаться? Интересно, почему был выбран не реализованный метод, который должен быть объявлен там в первую очередь.

  3. Существует ли этот эквивалент значения __refvalue(target, T) = value, например TypedReference.ToObject(value) для __refvalue(value, T)?

Изменить: для третьего вопроса я создал следующий код:

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, но я не думаю, что есть лучшее решение.

Теги:

1 ответ

2
Лучший ответ

В документации, на которую вы ссылаетесь, есть опция вверху, чтобы перейти к документации для более ранних версий.NET Framework, включая 1.1, которая гласит:

Возвращаемое значение

Этот метод присваивает значение цели. Тип изменения значения преобразует его в тип TypedReference. Метод Convert.ChangeType выполняет преобразование.

Это должно ответить на ваш первый вопрос.

Для вашего второго вопроса он был первоначально реализован, но был удален в.NET 2.0. Документация для.NET 2.0 показывает ее как реализованную, но это ошибка в документации (поскольку исправлена, как вы уже нашли).

Что касается того, почему это было отброшено, это немного догадалось, но я подозреваю, что это может быть объединено с вашим третьим вопросом: единственный предполагаемый прецедент TypedReference - это функции переменных аргументов, и это не требует каких-либо изменений в ссылочном значения. Главное, что.NET 2.0 добавляет, что у.NET 1.1 не было дженериков, и это избавляет от большинства непреднамеренных случаев использования (написания типового кода, который позволяет избежать бокса для типов значений), поэтому я думаю, что там просто не было особого смысла в реализации SetTypedReference. Теперь, когда у вас есть дженерики, вы можете использовать их для выполнения того, что вам нужно, вызывая общий метод, созданный с помощью T

Ещё вопросы

Сообщество Overcoder
Наверх
Меню