Практическое использование TypedReference
-
19-09-2019 - |
Вопрос
Есть ли практическое применение TypedReference
структуру, которую вы бы использовали в реальном коде?
РЕДАКТИРОВАТЬ:Платформа .Net использует их в перегрузках Console.WriteLine
и String.Concat
которые создают массив из __arglist
параметр и передать его в обычный params
перегрузка.Почему существуют эти перегрузки?
Решение
Есть ли какие-либо практические применения структуры TypedReference, которые вы действительно могли бы использовать в реальном коде?
Да.Я бы использовал их, если бы мне нужна была совместимость с вариационными методами C-стиля.
Почему существуют эти перегрузки?
Они существуют для взаимодействия с вызывающими объектами, которым нравится использовать вариационные методы в стиле 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!!