我有一个在.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);
}
是否有一种方法可以通过反射来实现,或者可以通过其他一些较小的努力来实现?对于我的实际问题,我可以(适当地)解决此问题,因此“否”确实是可以接受的答案,但是我很好奇是否有可能。
答案 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
}