是在静态对象上调用的TFS检查策略评估方法



我有以下示例TFS检查策略:

[Serializable()]
public class AuditControlsPolicy : PolicyBase
{
    public List<string> list;
    public AuditControlsPolicy() : base()
    {
        list = new List<string>() { "a", "b", "c" };
        System.Windows.Forms.MessageBox.Show("in constructor");
    }
    public override string Description
    {
        get { return "my description"; }
    }
    public override string Type
    {
        get { return "my policy"; }
    }
    public override string TypeDescription
    {
        get { return "description"; }
    }
    public override string InstallationInstructions
    {
        get { return "install instructions"; }
    }
    public override Microsoft.TeamFoundation.VersionControl.Client.PolicyFailure[] Evaluate()
    {
        List<PolicyFailure> policyFailures = new List<PolicyFailure>();
        if (list == null)
            System.Windows.Forms.MessageBox.Show("list is null");
        else
            System.Windows.Forms.MessageBox.Show(String.Join(",", list.ToArray()));
        return policyFailures.ToArray();
    }
    public override void DisplayHelp(PolicyFailure failure)
    {
        MessageBox.Show("No help available at this time");
    }
    public override void Activate(PolicyFailure failure)
    {
        MessageBox.Show(failure.Message);
    }
    protected override void OnPolicyStateChanged(PolicyFailure[] failures)
    {
        base.OnPolicyStateChanged(failures);
    }
    public override void Initialize(IPendingCheckin pendingCheckin)
    {
        base.Initialize(pendingCheckin);
        pendingCheckin.PendingChanges.CheckedPendingChangesChanged += PendingCheckinCheckedPendingChangesChanged;
    }
    public override void Dispose()
    {
        PendingCheckin.PendingChanges.CheckedPendingChangesChanged -= PendingCheckinCheckedPendingChangesChanged;
        base.Dispose();
    }
    private void PendingCheckinCheckedPendingChangesChanged(object sender, EventArgs e)
    {
        OnPolicyStateChanged(Evaluate());
    }
    public override bool Edit(IPolicyEditArgs policyEditArgs)
    {
        return true;
    }
}

它已正确注册并且"工作" - 但是,在调用Evaluate方法时,实例成员字段list未初始化。

当我切换到挂起的更改视图中,视觉工作室中至少有一个待处理的更改,我会多次获得" instructor"的消息框。接下来是"列表为null",即使我清楚地将实例构造函数中的字段初始化。如果我将list声明为静态并在实例构造函数中初始化它,则显示我的值列表。

,似乎Visual Studio在静态对象上调用Evaluate方法,即使不是这样声明。

Evaluate方法是否被调用为静态?我是否错过了我应该如何构建政策对象的东西?

评估方法不应在静态类中调用,并且Visual Studio也不会在静态对象上调用评估方法。代码中必须有问题,请尝试将list = new List<string>() { "a", "b", "c" };移至public override void Initialize(IPendingCheckin pendingCheckin)并重试。

根据您的描述和代码,猜测evaluate((方法已在AuditControlsPolicy之前的父类PolicyBase中调用,这就是为什么您获得list is nul的原因。

最新更新