На самом деле, я должен был спросить: как я могу сделать это и оставаться совместимым с CLS? Потому что единственный способ, которым я могу это сделать, заключается в следующем, но использование __makeref
, FieldInfo.SetValueDirect
или просто System.TypedReference
в целом делает недействительным CLS Compliance.
// code illustrating the issue:
TestFields fields = new TestFields { MaxValue = 1234 }; // test struct with one field
FieldInfo info = fields.GetType().GetField("MaxValue"); // get the FieldInfo
// actual magic, no boxing, not CLS compliant:
TypedReference reference = __makeref(fields);
info.SetValueDirect(reference, 4096);
Совместимым аналогом SetValueDirect
является SetValue
, но он принимает объект в качестве цели, поэтому моя структура будет упакована, что заставит меня установить значение для копии, а не для исходной переменной.
Общего аналога для SetValue
, насколько мне известно, не существует. Есть ли другой способ установить поле (ссылки на) структуры через отражение?