如何使用Resharper重新排序类型成员?

时间:2009-09-17 17:08:54

标签: c# resharper

典型场景:很多人都参与过的课程。我想按字母顺序对方法,属性等进行排序。

我希望能够在该地区或全球范围内这样做。

我在Resharper中看到了这个功能,但它似乎没有做任何事情。

8 个答案:

答案 0 :(得分:83)

使用“清理代码”功能。

可以在语言,C#,类型成员布局中的ReSharper选项中设置成员的顺序。这是一个记录良好的XML布局规范,ReSharper在重新排序成员时使用它。

答案 1 :(得分:50)

默认情况下不会激活排序。您可以通过打开resharper选项激活它,然后转到此处:

enter image description here

答案 2 :(得分:44)

为了像我这样的人,通过网络搜索找到这个问题,但发现问题的细节不是他们期望的那样,你可能想知道你可以移动个人成员按住Ctrl-Alt-Shift然后按向上或向下箭头,在文件中向下移动。

(显然,这不是按字母顺序在问题正文中提出的自动安排,但这是我希望我会在标题中找到问题的答案。)

答案 3 :(得分:4)

另一种考虑因素是Regionerate。我们使用和使用ReSharper,但Regionerate符合我们创建区域和排序/重新排列成员的需求。当然,它都是可定制的。

更新:我们已经开始使用ReSharper's Code Cleanup了。

答案 4 :(得分:3)

两件事:有一个已知的(但没有大量记录)条件,其中预编译条件(例如#if DEBUG)将停止类型成员重新排序。 http://youtrack.jetbrains.com/issue/RSRP-336643#tab=Comments 换句话说,如果你有#IF DEBUG那么它就不会重新排序。

我最近也注意到在ReSharper 8.0.1(可能还有早期版本)中,将XML模板还原为DEFAULT WITH REGIONS的按钮实际上没有包含#REGION分组的任何语句。所以我采用了一个StyleCop友好模板,其中包括排序并将#REGION-ing添加到每个类型成员。如果你选择CUSTOM TEMPLATE然后粘贴这个XML应该可以工作。

<Patterns xmlns="urn:shemas-jetbrains-com:member-reordering-patterns">

<!--  Do not reorder COM interfaces  -->
<Pattern>
    <Match>
        <And Weight="100">
            <Kind Is="interface" />
            <HasAttribute CLRName="System.Runtime.InteropServices.InterfaceTypeAttribute" />
        </And>
    </Match>
</Pattern>

<!--  Special formatting of NUnit test fixture  -->
<Pattern RemoveAllRegions="true">
    <Match>
        <And Weight="100">
            <Kind Is="class" />
            <HasAttribute CLRName="NUnit.Framework.TestFixtureAttribute" Inherit="true" />
        </And>
    </Match>

    <!--  Setup/Teardow  -->
    <Entry>
        <Match>
            <And>
                <Kind Is="method" />
                <Or>
                    <HasAttribute CLRName="NUnit.Framework.SetUpAttribute" Inherit="true" />
                    <HasAttribute CLRName="NUnit.Framework.TearDownAttribute" Inherit="true" />
                    <HasAttribute CLRName="NUnit.Framework.FixtureSetUpAttribute" Inherit="true" />
                    <HasAttribute CLRName="NUnit.Framework.FixtureTearDownAttribute" Inherit="true" />
                </Or>
            </And>
        </Match>
    </Entry>
    <!--  All other members  -->
    <Entry />
    <!--  Test methods  -->
    <Entry>
        <Match>
            <And Weight="100">
                <Kind Is="method" />
                <HasAttribute CLRName="NUnit.Framework.TestAttribute" Inherit="false" />
            </And>
        </Match>
        <Sort>
            <Name />
        </Sort>
    </Entry>
</Pattern>

<!--  Default pattern  -->


<Pattern RemoveAllRegions="false">
    <!--  Delegates  -->
    <Entry>
        <Match>
            <And Weight="100">
                <Access Is="public" />
                <Kind Is="delegate" />
            </And>
        </Match>
        <Sort>
            <Access Order="public internal protected-internal protected private" />
            <Name />
        </Sort>
        <Group Region="Delegates" />
    </Entry>


    <!--  Fields and constants  -->
    <Entry>
        <Match>
            <Or>
                <Kind Is="field" />
                <Kind Is="constant" />
            </Or>
        </Match>

        <Sort>
            <Access Order="public internal protected-internal protected private" />
            <Kind Order="constant" />
            <Readonly />
            <Static />
            <Name />
        </Sort>
        <Group Region="Fields" />
    </Entry>

    <!--  Enums  -->
    <Entry>
        <Match>
            <Kind Is="enum" />
        </Match>
        <Sort>
            <Access Order="public internal protected-internal protected private" />
            <Name />
        </Sort>
        <Group Region="Enums" />
    </Entry>

    <!--  Constructors. Place static one first  -->
    <Entry>
        <Match>
            <Kind Is="constructor" />
        </Match>
        <Sort>
            <Static />
            <Access Order="public internal protected-internal protected private" />
        </Sort>
        <Group Region="Constructors" />
    </Entry>

    <!--  Destructors. Place static one first  -->
    <Entry>
        <Match>
            <Kind Is="destructor" />
        </Match>
        <Sort>
            <Static />
            <Access Order="public internal protected-internal protected private" />
        </Sort>
        <Group Region="Destructors" />
    </Entry>


    <!--  Events  -->
    <Entry>
        <Match>
            <Kind Is="event" />
        </Match>

        <Sort>
            <Access Order="public internal protected-internal protected private" />
            <Name />
        </Sort>
        <Group Region="Events" />
    </Entry>

    <!--  Properties  -->
    <Entry>
        <Match>
            <And>
                <Kind Is="property" />
                <Not>
                    <Kind Is="indexer" />
                </Not>
            </And>
        </Match>
        <Sort>
            <Access Order="public internal protected-internal protected private" />
            <Static />
            <Abstract />
            <Virtual />
            <Override />
            <Name />
        </Sort>
        <Group Region="Properties" />
    </Entry>

    <!--  Indexers  -->
    <Entry>
        <Match>
            <Kind Is="indexer" />
        </Match>
        <Sort>
            <Access Order="public internal protected-internal protected private" />
            <Static />
            <Abstract />
            <Virtual />
            <Override />
            <Name />
        </Sort>
        <Group Region="Indexers" />
    </Entry>

    <!--  Methods  -->
    <Entry>
        <Match>
            <And>
                <Or>
                    <Kind Is="method" />
                    <Kind Is="operator" />
                    <HandlesEvent />
                </Or>
                <Not>
                    <Kind Is="destructor" />
                </Not>
            </And>
        </Match>
        <Sort>
            <Access Order="public internal protected-internal protected private" />
            <Static />
            <Abstract />
            <Virtual />
            <Override />
            <Name />
        </Sort>
        <Group Region="Methods" />
    </Entry>

    <!--  all other members  -->
    <Entry />

    <!--  nested types  -->
    <Entry>
        <Match>
            <Kind Is="type" />
        </Match>
        <Sort>
            <Access Order="public internal protected-internal protected private" />
            <Static />
            <Abstract />
            <Virtual />
            <Override />
            <Name />
        </Sort>
        <Group Region="Nested Types" />
    </Entry>
</Pattern>

答案 5 :(得分:0)

如果要重新排序特定方法的参数,可以使用Refactor&gt;如果光标位于方法名称上,请更改签名。我使用IntelliJ快捷方式,所以对我来说,命令是Ctrl + Shift + R,然后是Ctrl + F6。

Refactor context menu

执行此操作后,将弹出一个对话框,允许您重新排序方法参数。它甚至会重构任何接口的实现。

答案 6 :(得分:0)

jgauffin的答案很接近,但我发现(使用R#2017)重新排序属性我需要单击“文件布局”对话框标题中的“XAML”选项并更改

<Entry DisplayName="Properties, Indexers">
  <Entry.Match>
    <Or>
      <Kind Is="Property" />
      <Kind Is="Indexer" />
    </Or>
  </Entry.Match>
</Entry>

<Entry DisplayName="Properties, Indexers">
  <Entry.Match>
    <Or>
      <Kind Is="Property" />
      <Kind Is="Indexer" />
    </Or>
  </Entry.Match>
  <Entry.SortBy>
    <Name />
  </Entry.SortBy>
</Entry>

'Sort By'属性为空且只读,这是有道理的,因为它仅用于具有相同名称的项目(并且所有属性都应该唯一命名)

答案 7 :(得分:-1)

从Visual Studio菜单;

ReSharper&gt;选项&gt;环境&gt; IntelliSense&gt;完成行为&gt;对项目进行排序(按字母顺序排列)