【问题标题】:Is it possible to add event Intellisense functionality to a custom class in Visual Studio是否可以将事件智能感知功能添加到 Visual Studio 中的自定义类
【发布时间】:2021-01-26 01:12:59
【问题描述】:

我有一个自定义类,它对大多数代码库来说就像一个事件,但向内部类添加了一些额外的功能。这个类给我的好处是我可以提供一个单一的访问点来订阅事件,但也可以在内部传递事件,以便可以动态更改调用事件的适当系统。我遇到的最大问题是 Visual Studio 将不再在 += 之后按 Tab 时自动生成事件处理程序,我觉得这很烦人。

我已经考虑过编写一个 Visual Studio 扩展,但 ICompletionSource 似乎主要只是处理自动完成一个连续的字符串,并且在当前方法之外添加事件处理程序似乎相当困难更不用说弄清楚文本上下文何时是自定义事件之一并正确命名新的事件处理程序。

以下是自定义事件类的最简单版本作为示例,以防万一:

using System;

public class CustomEvent
{
     public delegate void CustomEventDelegate();

     private event CustomEventDelegate customEvent;

     public static CustomEvent operator +(CustomEvent e, CustomEventDelegate del)
     {
          e.customEvent = (CustomEventDelegate)Delegate.Combine(e.customEvent, del);
          return e;
     }

     public static CustomEvent operator -(CustomEvent e, CustomEventDelegate del)
     {
          e.customEvent = (CustomEventDelegate)Delegate.Remove(e.customEvent, del);
          return e;
     }

     internal void Invoke()
     {
          customEvent?.Invoke();
     }
}

【问题讨论】:

  • 使用自定义addremove 将事件公开为公共属性有帮助吗?然后你可以在那里做自定义代码。我了解这些要求,但不确定您是否已经考虑过。例如public event CustomEventDelegate CustomEvent { add { YourAdd(value); } remove { YourRemove(value); } }
  • 我可以将事件公开,但我试图让这个类尽可能地模仿标准的 c# 事件,因为只有内部代码关心它实际上不是一个事件。此更改也是重构的一部分,因为有很多使用自定义 addremove 访问器执行相同操作的事件。基本上,我对这个解决方案的最大问题是这些对象被命名为事件,当新开发人员开始使用代码库时我想避免混淆,因为开发人员不希望编写myClass.onEventRaised.customEvent += EventHandler
  • 尝试删除解决方案文件夹下的.vs隐藏文件夹。

标签: c# visual-studio events intellisense


【解决方案1】:

虽然这不能回答您的确切问题,但我相信它可以解决根本问题(智能感知不适用于您的自定义事件)。

这可能不符合我不了解真实课程的要求,但是您尝试过这样的事情吗?它适用于给出的示例。

public class CustomEvent
{
    public delegate void CustomEventDelegate();

    private CustomEventDelegate customEvent;
    public event CustomEventDelegate TheCustomEvent
    {
        add { AddToEvent(this, value); }
        remove { RemoveFromEvent(this, value); }
    }

    private static void AddToEvent(CustomEvent e, CustomEventDelegate del)
    {
        e.customEvent = (CustomEventDelegate)Delegate.Combine(e.customEvent, del);
    }

    private static void RemoveFromEvent(CustomEvent e, CustomEventDelegate del)
    {
        e.customEvent = (CustomEventDelegate)Delegate.Remove(e.customEvent, del);
    }

    internal void Invoke()
    {
        customEvent?.Invoke();
    }
}

【讨论】:

    猜你喜欢
    • 2012-06-07
    • 2014-11-25
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 2016-01-26
    • 2021-01-07
    • 2016-03-20
    相关资源
    最近更新 更多