Macros ReSharper 8-活动模板宏-热点项

Macros ReSharper 8-活动模板宏-热点项,macros,resharper,Macros,Resharper,我目前正在使用ReSharper V8.1。我最近才开始使用ReSharper,并对他们的LiveTemplate宏产生了一些兴趣。我想出了一个从常量返回热点项列表的解决方案,类似于ReSharper预定义的宏“逗号分隔的值列表”。在该方法中,我获取模板参数的常量变量,并对其执行拆分字符串以提供热点项的集合。不幸的是,如果我在一个模板中多次使用宏,它将不起作用。下面是一个极端的黑客工作,展示了我对IMacroImplementation的方法热点的实现 我希望有人可能已经在这方面做了一些工作,并

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

我希望有人可能已经在这方面做了一些工作,并可能提供一个示例,说明他们是如何实现IMacroImplementation的。IMacroImplementation提供了一个常量中的项目列表,还允许在一个模板中进行多个使用。 多谢各位

    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;
    }
public覆盖热点项目GetLookupItems(IHotspotContext上下文)
{
HotspotItems HotspotItems=null;
foreach(上下文中的var hotspot.HotspotSession.Hotspots)
{
if(hotspot.Expression!=null&((MacroCallExpressionNew)hotspot.Expression)。定义为Macros.DisplayMultipleItems)
{
//热点电流值
var multiItems=((MacroCallExpressionNew)hotspot.Expression)。定义为DisplayMultipleItems;
如果(!multiItems.ItemSet)
{
var expression=热点。表达式为MacroCallExpressionNew;
IMacroParameterValueNew baseValue=expression.Parameters[0].GetValue(context.SessionContext.Solution.GetLifetime(),context.HotspotSession);
字符串templateValue=baseValue.GetValue();
multiItems.ItemSet=true;
如果(!string.IsNullOrEmpty(templateValue)&&templateValue.Split(',').Any())
{
var lookupItems=templateValue.Split(',).Select(param=>newtextlokupitem(param)).Cast().ToList();
if(热点项==null)
热点项=新热点项(查找项);
其他的
{
foreach(lookupItems中的变量项)
{
热点项。项。添加(项);
}
}
}
}
}
}
返回热点;
}

您应该启动dotPeek并将其指向ReSharper bin目录,然后查看
ListMacroDef
ListMacroImpl
,这是逗号分隔列表宏的实现

该定义源自
SimpleMacroDefinition
。它在调用
GetPlaceholder
时获得给定的参数,查看第一个并用逗号将其拆分,将第一个项目作为占位符返回

ListMacroImpl
同样简单。它的构造函数有一个
[可选]
参数,类型为
MacroParameterValueCollection
。这是在热点编辑器中指定的参数值列表。您需要检查null并获取第一个参数,它将是您的分隔列表。然后,如果参数值为null,它将覆盖
GetLookupItems
并返回
HotspotItems.Empty
,或者解析该值并返回
TextLookupItem
的列表


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

您应该启动dotPeek并将其指向ReSharper bin目录,然后查看
ListMacroDef
ListMacroImpl
,这是逗号分隔列表宏的实现

该定义源自
SimpleMacroDefinition
。它在调用
GetPlaceholder
时获得给定的参数,查看第一个并用逗号将其拆分,将第一个项目作为占位符返回

ListMacroImpl
同样简单。它的构造函数有一个
[可选]
参数,类型为
MacroParameterValueCollection
。这是在热点编辑器中指定的参数值列表。您需要检查null并获取第一个参数,它将是您的分隔列表。然后,如果参数值为null,它将覆盖
GetLookupItems
并返回
HotspotItems.Empty
,或者解析该值并返回
TextLookupItem
的列表

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