【问题标题】:Is the TFS CheckIn Policy Evaluate method being invoked on a static object是否在静态对象上调用 TFS CheckIn Policy Evaluate 方法
【发布时间】:2018-04-10 10:34:21
【问题描述】:

我有以下示例 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 似乎没有初始化。

当我在 Visual Studio 中切换到 Pending Changes 视图时,至少有一个待定更改,我多次收到“In Constructor”消息框。这后面是“list is null”,即使我在实例构造函数中清楚地初始化了该字段。如果我将我的list 声明为静态并在实例构造函数中对其进行初始化,那么它会显示我的值列表。

看起来好像 Visual Studio 正在对静态对象调用 Evaluate 方法,即使它没有这样声明。

Evaluate 方法是否作为静态方法调用?我是否遗漏了一些关于我应该如何构建策略对象的内容?

【问题讨论】:

    标签: visual-studio tfs


    【解决方案1】:

    不应在静态类上调用 Evaluate 方法,并且 Visual Studio 也不会在静态对象上调用 Evaluate 方法。您的代码一定有问题,请尝试将list = new List&lt;string&gt;() { "a", "b", "c" }; 移动到public override void Initialize(IPendingCheckin pendingCheckin) 并重试。

    根据您的描述和代码,猜测 Evaluate() 方法已在 AuditControlsPolicy 之前在父类 PolicyBase 上被调用,这就是您得到 list is nul 的原因。

    【讨论】:

    • 我没有在我的签到政策中显示 MessageBox。我的示例代码试图说明我看到的问题。 PolicyBase 类是一个实例类,我的派生 Checkin 类也是如此。 Evaluate 方法也是实例方法。正如您在代码中看到的,有一个名为list 的实例变量在类的构造函数中初始化为'a'、'b'、'c'。我希望当 Visual Studio 调用 Evaluate 时,list 将包含“a”、“b”、“c”,但它没有。它是空的。
    • 如果我将 list 设为静态,那么我会得到我的 'a','b','c' 值。似乎 Visual Studio 没有在对象的实例上调用 Evaluate。
    • @codechurn 很抱歉造成误解,不应在静态类上调用 Evaluate 方法,Visual Studio 也不会在静态对象上调用 Evaluate 方法。你的代码一定有问题,尝试将list = new List&lt;string&gt;() { "a", "b", "c" };移动到public override void Initialize(IPendingCheckin pendingCheckin)再试一次
    • Evaluate 被调用时,我确实将list = new List&lt;string&gt;() { "a", "b", "c" } 移动到Initialize 并得到了预期的列表输出(值)。我不明白的是为什么 list 没有在构造函数中初始化。
    • @codechurn 没有注意到评论。很抱歉后来的回复。根据您的描述和我的测试,猜测 Evaluate() 方法已在 AuditControlsPolicy 之前在父类 PolicyBase 上被调用,这就是您得到 list is nul 的原因。
    猜你喜欢
    • 2011-05-14
    • 1970-01-01
    • 2023-03-16
    • 2016-09-13
    • 2012-04-26
    • 1970-01-01
    • 2022-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多