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

重写基类的内部只获取属性

  •  1
  • Lennart  · 技术社区  · 8 年前

    我有一个在.NET框架程序集中定义的类:

    public class ExternalClass
    {    
       internal double DesiredProperty => 1.0;    
    }
    

    我从ExternalClass派生,希望重写或以某种方式拦截对该属性的调用。我知道这会变得很糟糕,但这只是一个概念证明。

    我试着用直截了当的方式思考,但没有任何运气:

     private void DoEvilStuff()
        {
            var prop = typeof(ExternalClass).GetProperty("DesiredProperty", BindingFlags.Instance | BindingFlags.NonPublic);
    
            // Exception: Property has no setter
            prop.SetValue(this, 5);
        }
    

    another answer:

    private void DoEvilStuff()
    {
        var prop = typeof(ExternalClass).GetField("<DesiredProperty>k__BackingField", BindingFlags.Instance | BindingFlags.NonPublic);
    
        // fails, prop is null:
        prop.SetValue(this, 5);
    }
    

    有没有一种方法可以通过反射来做到这一点,或者用合理的小努力来实现这一点?我可以(适当地)为我的实际问题解决这个问题,所以“不”是一个可以接受的答案,但我很好奇这是否可能。

    1 回复  |  直到 8 年前
        1
  •  4
  •   Damien_The_Unbeliever    8 年前
    internal double DesiredProperty => 1.0;
    

    声明该属性具有 lambda表达式体 . 它编译成 方法 总是会回来的 1.0 . 您不能更改此方法返回的值,因为它不会存储在该方法的IL之外的任何地方。没有“支持字段”,这是您的第二个代码示例要查找的内容。

    例如,如果编译此代码,则会发出以下命令:

    .method assembly hidebysig specialname instance float64 get_DesiredProperty() cil managed
    {
        .maxstack 8
        L_0000: ldc.r8 1
        L_0009: ret 
    }