最简单的c#代码轮询属性
本文关键字:属性 代码 最简单 | 更新日期: 2023-09-27 18:01:39
我想知道轮询属性值的最简单代码,以便在其getter中执行代码。
目前我正在使用:instance.property.ToString();
,但我宁愿有一些没有可能的副作用或不必要的开销。
(我假设您试图避免简单地将值赋给未使用的变量所得到的警告)
你可以写一个无操作的扩展方法:
public static void NoOp<T>(this T value)
{
// Do nothing.
}
然后调用:
instance.SomeProperty.NoOp();
不会对值进行框化,也不会触碰它——只需要调用getter。与ToString
相比,它的另一个优点是,如果值是空引用,则不会发生错误。
它将要求对每个值类型的方法进行一次JIT编译,但这是一个相当小的成本…
听起来真是个糟糕的主意。老实说,如果你在getter中有逻辑需要定期执行,那就把它从getter中取出,放到一个方法中。我不喜欢跳进去维护这样的代码,一旦我最终弄清楚为什么会这样做,我就会重构它。
我会将getter中的代码提取到一个函数中,并从getter和轮询器中调用该函数,如果这是您的选项。
在变量中捕获它是最好的方法——它不会产生任何副作用,除非getter本身会产生副作用。
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"对象的构造函数中设置全局变量。
或. .(不确定你所说的全局变量是什么意思),但如果它是在一个对象中,那么你可以在你的全局对象上获取属性的getter来做一个延迟加载,然后获取值。
string _myProp;
public string MyProp
{
get
{
if (String.IsNullOrWhiteSpace(_myProp))
{
_myProp = GetTheValueFromWhereEver();
}
return _myProp;
}
}
(但你可能没有权限访问'instance')
尽管这可能仍然是一个坏主意,但我只想留下这个简洁的lambda解决方案:
((Func< [TYPE_OF_PROPERTY] >)(() => instance.Property))();