Практическое использование TypedReference
Есть ли практическое применение TypedReference
структура, которую вы бы на самом деле использовали в реальном коде?
РЕДАКТИРОВАТЬ:.Net Framework использует их в перегрузках Console.WriteLine
а также String.Concat
которые строят массив из __arglist
параметр и передать его в нормальное состояние params
перегрузки. Почему существуют эти перегрузки?
2 ответа
Есть ли практическое использование структуры TypedReference, которую вы бы фактически использовали в реальном коде?
Да. Я бы использовал их, если бы мне нужна была совместимость с вариадическими методами в стиле Си.
Почему существуют эти перегрузки?
Они существуют для взаимодействия с абонентами, которые любят использовать вариадические методы в стиле C.
Это кажется очень старым вопросом, но я хотел бы добавить еще один вариант использования: когда у вас есть структура и вы хотите установить ее переменную с помощью отражения, вы всегда будете работать с упакованным значением и никогда не менять оригинал. Это бесполезно
TestFields fields = new TestFields { MaxValue = 1234 };
FieldInfo info = typeof(TestFields).GetField("MaxValue");
info.SetValue(fields, 4096);
// result: fields.MaxValue is still 1234!!
Это можно исправить с помощью подразумеваемого бокса, но тогда вы потеряете безопасность типа. Вместо этого вы можете исправить это с помощью TypedParameter
:
TestFields fields = new TestFields { MaxValue = 1234 };
FieldInfo info = fields.GetType().GetField("MaxValue");
TypedReference reference = __makeref(fields);
info.SetValueDirect(reference, 4096);
// result: fields.MaxValue is now indeed 4096!!