首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ReSharper 8-动态模板宏- HotspotItems

ReSharper 8-动态模板宏- HotspotItems
EN

Stack Overflow用户
提问于 2013-11-11 12:59:21
回答 1查看 756关注 0票数 1

我目前正在使用ReSharper V8.1。我最近才开始使用ReSharper,并对他们的LiveTemplate宏产生了一些兴趣。我想出了一个从常量返回HotspotItems列表的解决方案,类似于ReSharper的预定义宏“逗号分隔的值列表”。在该方法中,我接受模板参数的常量变量,并对其执行拆分字符串,以提供HotSpotItems的集合。不幸的是,如果我在模板中多次使用宏,它就不能工作。下面是一个极端的黑客工作,展示了我实现的方法HotspotItems of IMacroImplementation。

我希望外面的人可能在这方面做了一些工作,并可能提供一个例子,说明他们是如何实现IMacroImplementation的,它从一个常量中提供了一个项目列表,并且允许在一个模板中进行多种用途。谢谢。

代码语言:javascript
复制
    public override HotspotItems GetLookupItems(IHotspotContext context)
    {



        HotspotItems hotSpotItems = null;
        foreach (var hotspot in context.HotspotSession.Hotspots)
        {
            if (hotspot.Expression != null && ((MacroCallExpressionNew)hotspot.Expression).Definition is Macros.DisplayMultipleItems)
            {
                //hotspot.CurrentValue
                var multiItems = ((MacroCallExpressionNew) hotspot.Expression).Definition as DisplayMultipleItems;
                if (!multiItems.ItemSet)
                {

                    var expression = hotspot.Expression as MacroCallExpressionNew;
                    IMacroParameterValueNew baseValue = expression.Parameters[0].GetValue(context.SessionContext.Solution.GetLifetime(), context.HotspotSession);
                    string templateValue = baseValue.GetValue();
                    multiItems.ItemSet = true;
                    if (!string.IsNullOrEmpty(templateValue) && templateValue.Split(',').Any())
                    {
                        var lookupItems = templateValue.Split(',').Select(param => new TextLookupItem(param)).Cast<ILookupItem>().ToList();
                        if (hotSpotItems == null)
                            hotSpotItems = new HotspotItems(lookupItems);
                        else
                        {
                            foreach (var item in lookupItems)
                            {
                              hotSpotItems.Items.Add(item);        
                            }

                        }

                    }
                }
            }

        }
        return hotSpotItems;
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-11 16:05:42

您应该激活dotPeek并将其指向ReSharper bin目录,并查看ListMacroDefListMacroImpl,这是以逗号分隔的list宏的实现。

定义来源于SimpleMacroDefinition。它获得对GetPlaceholder的调用中的参数,查看第一个参数并将其拆分为逗号,将第一个项作为占位符返回。

ListMacroImpl同样简单。其构造函数的[Optional]参数类型为MacroParameterValueCollection。这是hotspot编辑器中指定的参数值列表。您将希望检查null并接受第一个参数,这将是您的分隔列表。然后,如果参数值为null,则重写GetLookupItems并返回HotspotItems.Empty,或者解析该值并返回TextLookupItem列表。

您不需要查看会话和热点列表--当您只对当前热点感兴趣时,这将使您在会话中得到所有热点,而ReSharper将为每个热点创建一个新的IMacroImplementation,并在构造函数中为您提供这些值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19907010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档