1

我有这个类,在 .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);
    }

另一个答案:

private void DoEvilStuff()
{
    var prop = typeof(ExternalClass).GetField("<DesiredProperty>k__BackingField", BindingFlags.Instance | BindingFlags.NonPublic);

    // fails, prop is null:
    prop.SetValue(this, 5);
}

有没有办法通过反射来做到这一点,或者任何其他合理的小努力方法?对于我的实际问题,我可以(正确地)解决这个问题,所以“否”确实是一个可以接受的答案,但我很好奇这是否可能。

4

1 回答 1

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 
}
于 2018-07-02T09:19:21.493 回答