用于轮询属性的最简单的C#代码?

我想知道用于轮询属性值的最简单代码,以在其getter中执行代码。
目前我正在使用: instance.property.ToString(); ,但我宁愿有一些没有可能的副作用或不必要的开销。

(我假设你试图避免从简单地将值分配给未使用的变量时得到的警告。)

你可以编写一个无操作的扩展方法:

 public static void NoOp(this T value) { // Do nothing. } 

然后打电话:

 instance.SomeProperty.NoOp(); 

这不会包装价值或触摸它 – 只需调用getter。 这个优于ToString另一个优点是,如果该值是空引用,则不会发生这种情况。

每个值类型需要JIT编译一次方法,但这是一个相当小的成本…

这听起来像是一个非常糟糕的主意。 老实说,如果你有一个需要定期执行的getter中的逻辑,那就把它从getter中取出并粘贴在一个方法中。 我不愿意跳进去维护这样的代码,一旦我终于弄清楚它为什么会这样做,我会重构它。

我会将getter中的代码提取到函数中并从getter和poller中调用该函数,如果这是一个选项。

在变量中捕获它是最好的方法 – 除非吸气剂本身引起副作用,否则不会引起任何副作用。

var value = someObj.Property;

我希望我明白这是正确的。 首先

 class MyClass { public int Number{get;set;} } var cl = new MyClass(); cl.Number.ToString(); 

ToString()不一定返回值,对于原语,情况就是这样,但是对于其他更复杂的类,它通常只是完全限定名。 我猜这不是你想要的。

要执行getter,需要进行一些反思。

 var propInfo = this.GetType().GetProperty("Number"); int val = (int)propInfo.GetValue(cl, null); 

我喜欢Jon Skeet的答案,但同样的,这也可以在不必编写扩展方法的情况下工作:

 GC.KeepAlive(instance.SomeProperty); 

KeepAlive方法接受一个object并且不执行任何操作,如NoOp扩展方法。

我认为你需要将代码移动到其他地方。 因此,尝试在“instance”对象的构造函数中设置global var。

或者..(不确定你的全局变量是什么意思)但是如果它在一个对象中,那么你可以在你的全局对象上得到属性的getter来做一个延迟加载并获得值。

 string _myProp; public string MyProp { get { if (String.IsNullOrWhiteSpace(_myProp)) { _myProp = GetTheValueFromWhereEver(); } return _myProp; } } 

(但你可能无法访问那里的’实例’)

即使它可能仍然是一个坏主意,我只想留下这个简洁的lambda解决方案:

 ((Func< [TYPE_OF_PROPERTY] >)(() => instance.Property))();