! 그것은 조금 주조와 반성을 포함하지만, 실제로 지금까지 한 모든 테스트에서 안정적으로 작동합니다.
R #에는 인터페이스가 IBulbItemsProvider이며, bulb 항목, 즉 R #- 문구 중 하나가 열릴 때마다 전구 동작을 감싸는 메뉴 항목에 대해 구현이 동적으로로드되고 쿼리됩니다. 이제 다음 공급자를 구현했습니다.
[SolutionComponent]
public class BulbItemInstrumentationComponent : IBulbActionprovider
{
public int Priority { get{ return int.MaxValue; } }
public object PreExecute(ITextControl tc) { return null; }
public void CollectActions(IntentionsBulbItems ibis, ...)
{
var bulbItems = ibis.AllBulbMenuItems;
foreach (var execItem in bulbItems.Select(item => item.ExecutableItem))
{
var proxy = execItem as IntentionAction.MyExecutableProxi;
if (proxy != null)
{
proxy.WrapBulbAction();
continue;
}
var exec = execItem as ExecutableItem;
if (exec != null)
{
exec.WrapBulbAction();
continue;
}
throw new Exception("unexpected item type: " + execItem.GetType().FullName);
}
}
}
반환 값은 내 공급자가 모든 기존 공급자 중 마지막에 호출되도록합니다. 이렇게하면 다른 공급자에서 수집 한 BulbMenuItems가 이미 포함 된 CollectAction()의 IntensionsBulbItems 매개 변수가 생성됩니다.
그런 다음이 모든 항목을 반복하고 내 관찰 래퍼를 설치하십시오. 따라서 항목 실행 파일을 실제 유형으로 다운 캐스팅해야합니다. R # Core의 전구 항목의 경우 위에서 언급 한 두 가지 유형 만 사용중인 것으로 보입니다. R # Extension의 공급자는 실제로 다른 유형을 사용할 수 있습니다.이 경우 루프의 끝에서 예외가 나중에 좀 더 관대 한 처리로 대체됩니다.)
WrapBulbAction() 확장에서 구현됩니다. 행동 양식. LoggingBulbActionProxy가 IBulbAction 자체 위임 IBulbAction에 대한 모든 호출을 구현
static class BulbItemInstrumentationExtensions
{
private static readonly MethodInfo MyExecutableProxiBulbActionSetter =
typeof (IntentionAction.MyExecutableProxi).GetProperty("BulbAction").GetSetMethod(true);
private static readonly FieldInfo ExecutableItemActionField =
typeof (ExecutableItem).GetField("myAction", BindingFlags.NonPublic | BindingFlags.Instance);
public static void WrapBulbAction(this IntentionAction.MyExecutableProxi proxi)
{
var originalBulbAction = proxy.BulbAction;
var bulbActionProxy = new LoggingBulbActionProxy(originalBulbAction);
MyExecutableProxiBulbActionSetter.Invoke(proxy, new object[] {bulbActionProxy});
}
public static void WrapBulbAction(this ExecutableItem exec)
{
var originalAction = (Action) ExecutableItemActionField.GetValue(exec);
var actionProxy = new LoggingActionProxy(originalAction);
var newAction = (Action) (wrapper.Execute);
ExecutableItemActionField.SetValue(exec, newAction);
}
}
함으로써) (모든 실행 호출 로깅, 생성자에 전달 된 다음과 같은 이러한 보인다. LoggingActionProxy는 Execute() 메서드를 선언하는 클래스로, 로깅의 경우에는 생성자에 전달 된 Action에 위임합니다.
이제 R # BulbActions의 모든 사용법을 기록 할 수있게되었습니다. 내 길을 찾는 데 어려움이 있었지만 마침내 그 도전을 이겨냈습니다. 희망이 누군가 어딘가에 도움이되기를 바랍니다.
그래서 설문 조사입니까? – TheGeekZn
내 그룹은 코드 완성, 정적 코드 분석 등과 같은 IDE 도구 개선에 노력하고 있습니다. 현재 우리는 도구를 사용하는 방법과 장소를 개선하기 위해 도구 사용 방법을 분석하려고합니다. –
이것은 개발 문제를 토대로 한 질문 및 답변 사이트입니다 (실습 정보가 아닙니다). 나는이 질문이 그와 관련이 있다고 생각하지 않는다. – TheGeekZn