我想使用[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; }
}
现在,由于一,二,三不按字母顺序排列,因此默认排序为一,三,二。有没有办法改变这个?我知道类型成员布局能够注意属性,但是无法找到从属性中收集数据并在排序中使用它的方法。
谢谢!
答案 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]
属性的类,但不指定规则,因此不会重新排序属性或字段。