确定一个方法是否已经被GetValue .net调用

本文关键字:GetValue 调用 net 是否 方法 一个 | 更新日期: 2023-09-27 18:19:03

是否有一个。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类,没有发现任何有用的东西。

任何想法?

作为基于反馈的额外说明(感谢您的参与!),我将无法修改我正在检查的现有对象。

确定一个方法是否已经被GetValue .net调用

我认为你达到这个目标的方法太复杂了。您可以简单地使用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
    }
}