【发布时间】:2014-01-03 10:29:42
【问题描述】:
我有一个 Item 类(我无权访问它),它有两种不同的方式来访问 Item 的字段。我想要一个自定义的 FxCop 规则,它优先于另一个。
我可以通过拥有一个项目并直接访问item["fieldname"] 来从特定字段中获取值,这将返回一个字符串。
代码:
public string this[string fieldName]
{
get
{
Assert.ArgumentNotNullOrEmpty(fieldName, "fieldName");
ID result;
if (ID.TryParse(fieldName, out result))
return this[result];
if ((int) fieldName[0] == 64)
return this.Fields.GetSpecialField(fieldName);
Field field = this.Fields[fieldName];
if (field == null)
return "";
else
return field.Value;
}
set
{
Assert.ArgumentNotNullOrEmpty(fieldName, "fieldName");
ID result;
if (ID.TryParse(fieldName, out result))
{
this[result] = value;
}
else
{
Field field = this.Fields[fieldName];
if (field == null)
return;
field.Value = value;
}
}
}
public string this[int index]
{
get
{
Field field = this.Fields[index];
if (field == null)
return "";
else
return field.Value;
}
set
{
Field field = this.Fields[index];
if (field == null)
return;
field.Value = value;
}
}
public string this[ID fieldID]
{
get
{
Assert.ArgumentNotNull((object) fieldID, "fieldID");
return this.Fields[fieldID].Value;
}
set
{
Assert.ArgumentNotNull((object) fieldID, "fieldID");
this.Fields[fieldID].Value = value;
}
}
或者,我可以像这样访问 Field 属性:item.Fields["Fieldname"].Value。
替代代码:
public Field this[ID fieldID]
{
get
{
return new Field(fieldID, this._ownerItem);
}
}
public Field this[string fieldName]
{
get
{
ID fieldId = TemplateManager.GetFieldId(fieldName, this.TemplateId, this.Database);
if (fieldId == null)
return (Field) null;
else
return this[fieldId];
}
}
public Field this[int index]
{
get
{
Field[] fields = this.GetFields();
if (index < fields.Length && index >= 0)
return fields[index];
else
return (Field) null;
}
}
这种方法可能会抛出NullReferenceException,例如如果字段名拼写错误。然后Field 对象将是null,因此无法检索该值。
现在,由于第一种方法更安全,我想在使用第二种方法时发出警告。我发现我需要使用
public override ProblemCollection Check(Member member)
{
}
方法,然后将成员转换为Microsoft.FxCop.Sdk.PropertyNode。但是,从那里开始,我不知道该怎么做,尤其是因为它们最后使用相同的代码(第一个选项调用第二个选项,但是如果字段名拼写错误并且字段为空,则第一个选项将只返回一个空字符串)。
或者,如果这不可能,如果使用第二个选项而不检查字段的空值,我想给出 FxCop 错误。
一些管理细节:我正在使用带有 FxCop 10 的 Visual Studio 2012。
编辑
只是为了进一步澄清,这条规则不应该检查属性本身(即类似Naming.IdentifiersShouldBeCasedCorrectly),而是如何从代码中的其他地方调用它们。
【问题讨论】: