TypedReference的实际用途

时间:2009-11-10 21:36:50

标签: c# .net typedreference

您在实际代码中实际使用的TypedReference结构体是否有任何实际用途?

编辑:.Net框架在Console.WriteLineString.Concat的重载中使用它们,它们从__arglist参数构建数组并将其传递给正常params超载。为什么存在这些重载?

2 个答案:

答案 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!!