我想知道最简单的代码来轮询属性值,以执行其getter中的代码。
目前我正在使用:
目前我正在使用:
instance.property.ToString();
,但我更希望有一些没有可能引起副作用或不必要开销的东西。instance.property.ToString();
,但我更希望有一些没有可能引起副作用或不必要开销的东西。public static void NoOp<T>(this T value)
{
// Do nothing.
}
然后调用:
instance.SomeProperty.NoOp();
这不会包装值或者直接接触它 - 只会调用getter。相比于使用ToString
的另一个优点是,如果值为null引用,则不会出现错误。
但是它每个值类型需要一次JIT编译,但这是一个相当小的代价...
我认为这听起来是一个非常糟糕的想法。如果你的getter中有需要经常执行的逻辑,请将其从getter中移出并放入方法中。我不希望跳进去维护那样的代码,一旦我最终弄清楚它为什么会做某些事情,我就会对其进行重构。
虽然这可能仍然不是一个好主意,但我只想提供这个简洁的lambda解决方案:
((Func< [TYPE_OF_PROPERTY] >)(() => instance.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
扩展方法。
GC.KeepAlive(null)
是做什么的。 - Jon Skeet我认为你需要将代码移动到其他地方。因此,请尝试在“实例”对象的构造函数中设置全局变量。
或者,(不确定您所说的全局变量是什么),但如果它在一个对象中,则可以使用全局对象上的getter来进行惰性加载并获取值。
string _myProp;
public string MyProp
{
get
{
if (String.IsNullOrWhiteSpace(_myProp))
{
_myProp = GetTheValueFromWhereEver();
}
return _myProp;
}
}
(但您可能没有访问那里的“实例”)
MyProp
属性以确保 _myProp
已设置?(这就是我要问的。) - Protector one将其存储在变量中是最好的方法 - 除非getter本身引起副作用,否则不会产生任何副作用。
var value = someObj.Property;
ToString
也不是问题),我只是很好奇是否有更简洁、更简单的方法来做到这一点。 - Protector one
Instance.Property
确实会轮询它,但这并不是一个完整的语句。我不能只在末尾加上一个分号,希望编译器不会注意到。 - Protector oneTouch
,例如instance.SomeProperty.Touch();
这样至少你的代码能够给出一些关于正在发生什么的线索。 - Robert Harvey