1

ReSharper 8.X 附带了一个获取“包含类型名称”的宏,但我想做的是操纵该名称。我在 Visual Studio 2013 Web API 项目中使用它,我想要一个模板,它采用类名并构建必须调用的 URL。因此,例如,假设我有这个:

public class AnnouncementController : ApiController
{
    //Want to put a template here!
    [HttpGet]
    public HttpResponseMessage GetActiveAnnouncements()
    {
        /// ...
    }
 }

现在我的 ReSharper 模板将如下所示:

    /// This sample shows how to call the <see cref="$METHOD$"/> method of controller $CLASS$ using the Web API.
    ///      https://myurl.mydomain.com/api/$CONTROLLER$/$METHOD$

按照惯例,$Controller$ 是类名减去字母“Controller”。这是因为 ASP.NET MVC Web API 项目期望从 ApiController 派生的类以字符串 'Controller' 结尾,

由于这个类是 AnnouncementController,模板应该输出

https://myurl.mydomain.com/api/Announcement/GetActiveAnnouncements

Resharper 的内置宏可以给我一些我需要的东西,但我想编写一个自定义宏来获取包含的类型名称并从中删除“控制器”。我想直接这样做,而不是将包含的类型名称存储在另一个参数中。

另外,如何安装这个自定义宏?我在 Google 上四处搜索,发现很多死链接和为 ReSharper 版本 7 及更低版本编写的旧演练不适用于 ReSharper 8.x

4

2 回答 2

2

经过大量的战斗,这是我的解决方案。

[MacroImplementation(Definition = typeof (ControllerNameMacroDefinition))]
public class ControllerNameMacroImplementation : SimpleMacroImplementation
{

    public ControllerNameMacroImplementation([Optional] IReadOnlyCollection<IMacroParameterValueNew> arguments)
    {

    }

    public override HotspotItems GetLookupItems(IHotspotContext context)
    {
        var ret = "CONTROLLER";
        var fileName = GetFileName(context);
        if (!fileName.IsNullOrEmpty())
        {
            //Replace "Controller.cs" in two separate steps in case the extension is absent
            ret = fileName.Replace("Controller", "").Replace(".cs", "");
        }
        return MacroUtil.SimpleEvaluateResult(ret);
    }

    /// <summary>
    /// Returns the filename of the current hotspot context
    /// </summary>
    private string GetFileName(IHotspotContext context)
    {
        var psiSourceFile = context.ExpressionRange.Document.GetPsiSourceFile(context.SessionContext.Solution);
        return psiSourceFile == null ? string.Empty : psiSourceFile.Name;
    }
}
于 2014-06-10T14:34:59.543 回答
0

我想这样做,但是对于 JavaScript Jasmine 测试 -- SomethingViewModel.js,带有 的夹具SomethingViewModelFixture.js,但希望能够SomethingViewModel在文件中引用。对上述内容进行了一些细微的修改使其成为可能。

不幸的是,为了让你的插件真正安装,你还需要做很多事情。这是一个清单。我希望它是全面的。

  • NuGet package install JetBrains.ReSharper.SDK,请确保您安装了正确的版本!
  • 将您的类库 DLL 复制到C:\Users\<you>\AppData\Local\JetBrains\ReSharper\<version>\plugins\<your plugin name>,如果需要,创建插件目录。
  • 您需要AssemblyInfo.cs文件中的插件注释:
    • [assembly: PluginTitle("Your extensions for ReSharper")]
    • [assembly: PluginDescription("Some description")] -- 这显示在 ReSharper->Options->Plugins 中
    • [assembly: PluginVendor("You")]
  • 您的项目中需要一个定义MacroDefinition, 以及上述内容的类MacroImplementation
    • [MacroDefinition("MyNamespace.MyClassName", ShortDescription = "A short description of what it does.", LongDescription = "A long description of what it does.")]
    • “ShortDescription” - 这显示在“选择宏”对话框列表中。
    • “LongDescription”你会认为这会在“选择宏”描述中,但事实并非如此。
    • 我刚刚将此注释添加到上述文件中。
  • 添加MacroDefinition到的文件需要实现IMacroDefinition,它有一个方法(GetPlaceholder)和一个属性(Parameters)。前者可以返回任何字符串(“a”),后者可以返回一个空数组。
  • 如果你愿意,你可以忽略 WiX/NuGet 的东西。仅用于本地安装。
  • 在 VS 中,ReSharper->Options->Plugins 部分有一些关于您的插件可能无法加载的故障排除详细信息。

祝你好运!

于 2014-08-18T20:23:18.813 回答