代码之家  ›  专栏  ›  技术社区  ›  SLaks

TypedReference的实际应用

  •  29
  • SLaks  · 技术社区  · 16 年前

    TypedReference

    Console.WriteLine String.Concat 它从一个 __arglist params

    2 回复  |  直到 16 年前
        1
  •  20
  •   konrad.kruczynski    10 年前

    TypedReference结构体在实际代码中有实际用途吗?

    对。如果我需要与C风格变量方法的互操作性,我会使用它们。

    为什么会存在这些过载?

        2
  •  16
  •   Abel    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!!