Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# FxCop以特定方式访问属性的规则_C#_Fxcop - Fatal编程技术网

C# FxCop以特定方式访问属性的规则

C# FxCop以特定方式访问属性的规则,c#,fxcop,C#,Fxcop,我有一个Item类(我无权访问),它有两种不同的方式来访问Item的字段。我希望有一个自定义的FxCop规则,它更喜欢一个而不是另一个 我可以通过拥有一个项并直接访问item[“fieldname”]从特定字段获取值,这将返回一个字符串 此操作的代码: public string this[string fieldName] { get { Assert.ArgumentNotNullOrEmpty(fieldName, "fieldName"); ID result;

我有一个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;
  }
}
或者,我可以像这样访问字段属性:
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;
  }
}
方法,然后将成员强制转换为
Microsoft.FxCop.Sdk.PropertyNode
。但是,从那里开始,我不知道该怎么做,特别是因为它们在最后使用相同的代码(第一个选项调用第二个选项,但是如果字段名拼写错误并且字段为空,第一个选项将只返回一个空字符串)

或者,如果不可能,我想给出一个FxCop错误,如果使用第二个选项时没有检查字段的null值

一些管理细节:我正在使用VisualStudio2012和FxCop 10

编辑

为了进一步澄清,此规则不应检查属性本身(即类似于
命名.identifiers的内容应正确设置为
),而应检查如何从代码中的其他位置调用它们

为什么不使用de?

因为您正在查看代码中其他地方如何使用属性,所以需要使用
BaseIntrospectionRule
的访问者模式支持来查找对有问题属性的引用

只有已分析程序集的内容才会传递给
检查
,因此,如果包含
字段集合
的程序集仅被引用而未被分析,则
索引器不应引起问题

不必深入研究数据流分析(这在很大程度上超出了内省者的范围),您可以通过在所有分析过的方法体中运行访问者并标记
字段的调用来获得非常粗略的近似值。Value
getter:

public override ProblemCollection Check(Member member)
{
    var method = member as Method;
    if (method != null)
    {
        VisitStatements(method.Body.Statements);
    }
    return Problems;
}

public override void VisitMethodCall(MethodCall methodCall)
{
    var memberBinding = methodCall.Callee as MemberBinding;
    if (memberBinding != null)
    {
        var methodCalled = memberBinding.BoundMember as Method;
        if (methodCalled != null)
        {
            if (methodCalled.FullName == "Some.Namespace.Field.get_Value")
                Problems.Add(new Problem(GetResolution(), methodCall));
        }
    }
    base.VisitMethodCall(methodCall);
}

更好的近似值也会遍历到
方法调用
的第0个
操作数
,只有当该
操作数
是对
字段集合
索引器的调用时才会出现问题。

,因为Item类不是我自己创建的(我也无权访问它的源代码)。我将把它添加到问题中。请看:。From:太好了,看起来很有魅力(至少对于我做的快速测试来说)。出于某种原因,我没有考虑引用程序集,因此我不需要担心太多。
public override ProblemCollection Check(Member member)
{
    var method = member as Method;
    if (method != null)
    {
        VisitStatements(method.Body.Statements);
    }
    return Problems;
}

public override void VisitMethodCall(MethodCall methodCall)
{
    var memberBinding = methodCall.Callee as MemberBinding;
    if (memberBinding != null)
    {
        var methodCalled = memberBinding.BoundMember as Method;
        if (methodCalled != null)
        {
            if (methodCalled.FullName == "Some.Namespace.Field.get_Value")
                Problems.Add(new Problem(GetResolution(), methodCall));
        }
    }
    base.VisitMethodCall(methodCall);
}