是否有一个。net方法来确定一个给定的方法是否已经被先前的给定对象实例调用?
有时候属性getter方法有副作用。例如,如果先前未调用属性getter,则可能需要创建其他对象并执行其他工作,以便返回后备字段的值。我不能让这种事发生。如果getter方法以前没有被调用过,我就不需要这个值。
例如…object item = something;
foreach (PropertyInfo propertyInfoForItem in item.GetProperties(Reflection.BindingFlags.Public)) {
//Need something to avoid calling this if the property getter method has not been previously been called for this item
object itemPropertyValue = nothing;
itemPropertyValue = propertyInfoForItem.GetValue(item, null);
}
我已经查看了PropertyInfo.GetGetMethod()返回的MethodInfo类,没有发现任何有用的东西。
任何想法?
作为基于反馈的额外说明(感谢您的参与!),我将无法修改我正在检查的现有对象。
我认为你达到这个目标的方法太复杂了。您可以简单地使用bool
或数字类级别变量来实现此目的。
public class C
{
private int _counter = 0;
// private bool _methodCalled = false;
public void M()
{
// check the state of _counter or _methodCalled
_counter++;
// _methodCalled = true;
}
}
如果您想要考虑所有调用,而不考虑用于调用它的类的实例,则可以使用私有变量static
。
编辑
由于不能修改类(如注释中所述),因此需要创建一个包装器类来聚合类并保存计数器。
public class CWrapper
{
private int _counter = 0;
private C _c = new C();
public M()
{
if (_counter == 0)
{
_c.M();
}
counter++;
}
}
既然您已经说过几次您无法修改有问题的对象,那么您唯一的选择就是为这些对象类型实现包装类。在包装器类中,您可以公开所讨论对象的所有属性和方法,但是您可以在包装器getter中实现其他答案中建议的引用计数。
如果您需要在访问对象之前确定是否调用了Getter,恐怕您运气不好。
你可以在类中创建一个静态计数,然后在方法中第一次增加到1,如果是0,然后增加到1,那么你知道它已经被调用了,你可以返回-1或其他
您可以使用decorator设计模式来完成此操作。
class Program
{
static void Main(string[] args) {
var hasDoMethodInstance = new HasDoMethodImpl();
var hasDoMethodDecoratorInstance = new HasDoMethodDecorator(hasDoMethodInstance);
hasDoMethodDecoratorInstance.Do();
}
}
public interface IHasDoMethod
{
void Do();
}
public class HasDoMethodDecorator : IHasDoMethod
{
private int counter = 0;
private readonly IHasDoMethod hasDoMethod;
public HasDoMethodDecorator(IHasDoMethod hasDoMethod) {
this.hasDoMethod = hasDoMethod;
}
public void Do() {
hasDoMethod.Do();
counter++;
}
}
public class HasDoMethodImpl : IHasDoMethod
{
public void Do() {
//Your logic
}
}