ReSharper类型成员布局排序和[DataMember]属性

时间:2014-12-15 19:02:26

标签: c# resharper

我想使用[DataMember]属性定义标准WCF数据协定。我还想指定Order属性。执行自动格式时,ReSharper会重新排序我的属性,因此它们不再按照[DataMember]属性中指定的顺序排列。

现在这对已编译的代码没有任何影响,但确实让它很烦人。

有没有办法让ReSharper的类型成员布局尊重我在属性中定义的顺序?

public class MyDataContract
{
    [DataMember(Order = 1)]
    public int One { get; set; }
    [DataMember(Order = 2)]
    public int Two { get; set; }
    [DataMember(Order = 3)]
    public int Three { get; set; }
}

现在,由于一,二,三不按字母顺序排列,因此默认排序为一,三,二。有没有办法改变这个?我知道类型成员布局能够注意属性,但是无法找到从属性中收集数据并在排序中使用它的方法。

谢谢!

1 个答案:

答案 0 :(得分:2)

据我所知,ReSharper的默认设置是不重新排序属性,因此您提供的示例不会重新排序。但是,它会按名称对字段进行排序,这可能是您遇到的情况。

幸运的是,可以使用“选项”对话框编辑订单。但是,据我所知,您需要指定一个类属性才能匹配正在应用的规则。在这种情况下,您的类可以具有[DataContract]属性,这使得它非常简单。

ReSharper 9有一个很好的闪亮的新视觉编辑器来定义布局和排序:代码编辑→C#→文件布局。您可以查看COM互操作规则,了解它们如何处理以忽略COM结构的排序(基本上,匹配COM属性并且没有规则)。

ReSharper 8使您可以在稍微不同的选项页面中编辑可怕的XML文件:代码编辑→C#→键入成员布局。选择"自定义布局"并向下滚动,直到找到带注释的部分"不要重新排序COM接口..."。您想要创建一个类似于:

的新Pattern元素
<Pattern>
  <Match>
    <And>
      <Kind Is="class"/>
      <HasAttribute CLRName="System.Runtime.Serialization.DataContractAttribute"/>
    </And>
  </Match>
</Pattern>

此模式将匹配具有[DataContract]属性的类,但不指定规则,因此不会重新排序属性或字段。