最简单的c#代码轮询属性

本文关键字:属性 代码 最简单 | 更新日期: 2023-09-27 18:01:39

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

最简单的c#代码轮询属性

(我假设您试图避免简单地将值赋给未使用的变量所得到的警告)

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

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))();