您在实际代码中实际使用的TypedReference
结构体是否有任何实际用途?
编辑:.Net框架在Console.WriteLine
和String.Concat
的重载中使用它们,它们从__arglist
参数构建数组并将其传递给正常params
超载。为什么存在这些重载?
答案 0 :(得分:17)
您实际在实际代码中使用的TypedReference结构是否有任何实际用途?
是。如果我需要与C风格的可变方法的互操作性,我会使用它们。
为什么存在这些重载?
它们的存在是为了与喜欢使用C风格的可变方法的调用者进行互操作。
答案 1 :(得分:13)
这似乎是一个非常古老的问题,但我想再增加一个用例:当你有一个结构并希望通过反射设置它的变量时,你总是会对盒装值进行操作并且永远不会改变原本的。这没用:
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!!