我有以下示例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
的原因。