从基类重写内部仅获取属性

时间:2018-07-02 09:16:27

标签: c# reflection

我有一个在.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 个答案:

答案 0 :(得分:4)

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 
}