【问题标题】:Tool to generate interface implementation by delegation?通过委托生成接口实现的工具?
【发布时间】:2010-11-19 12:21:19
【问题描述】:

我经常需要通过将实现委托给我的类的成员来实现接口。这个任务相当乏味,因为即使 Visual Studio 为接口方法生成存根,我仍然必须编写代码来委派实现。它不需要太多思考,所以它可能会被代码生成工具自动化......

我可能不是第一个想到这个的人,所以肯定已经有这样的工具了,但是我在 Google 上找不到任何东西......有什么想法吗?


编辑:似乎ReSharper can do it,但它相当昂贵...有没有具有相同功能的免费替代品?

【问题讨论】:

  • 啊提取装饰器。多年来,我一直想在 Coderush 中做到这一点 - 从来没有找到时间。我会对这个问题的答案感兴趣。

标签: c# interface code-generation delegation


【解决方案1】:

我已经使用 Resharper 几个月了,它有一个很棒的功能可以做到这一点。

例如,编写以下代码:

class MyList<T> : IList<T>
{
    private readonly IList<T> _list;
}

将插入符号放在_list,按Alt + Ins(生成代码的快捷方式),然后选择“委派成员”。选择您需要的成员,然后 R# 为他们生成委派成员:

    public void Add(T item)
    {
        _list.Add(item);
    }

    public void Clear()
    {
        _list.Clear();
    }

    public bool Contains(T item)
    {
        return _list.Contains(item);
    }

    public void CopyTo(T[] array, int arrayIndex)
    {
        _list.CopyTo(array, arrayIndex);
    }

    public bool Remove(T item)
    {
        return _list.Remove(item);
    }

    public int Count
    {
        get { return _list.Count; }
    }

    public bool IsReadOnly
    {
        get { return _list.IsReadOnly; }
    }

    public int IndexOf(T item)
    {
        return _list.IndexOf(item);
    }

    public void Insert(int index, T item)
    {
        _list.Insert(index, item);
    }

    public void RemoveAt(int index)
    {
        _list.RemoveAt(index);
    }

    public T this[int index]
    {
        get { return _list[index]; }
        set { _list[index] = value; }
    }

【讨论】:

    【解决方案2】:

    【讨论】:

    • 感谢您的回答!这个工具看起来不错,但它只允许将此模式应用于同一项目中的类型。我需要为 BCL 类型(通常是 ICollection&lt;T&gt;IDictionary&lt;K,V&gt;)做这件事
    【解决方案3】:

    ...查看动态代理...

    不过……

    将接口实现委托给实例变量或类型 [如 typeof(type)] 的能力是 C# 和 VB.Net 非常需要的语言特性。由于没有多重继承以及密封和非虚拟方法和属性的盛行,所需的绒毛代码量令人望而生畏。

    我认为以下语言增强会起作用... //C#

    interface IY_1
    {
      int Y1;
      int Y2;
    }
    ...
    ..
    interface IY_n
    {
    ....
    ..
    }
    
    
    class Y : IY_1, IY_2, ....,IY_n
    {
      private readonly Oy_1 Oy_1 = new Oy_1() supports IY_1, IY_2,...etc;   // <<-----
      private readonly Oy_2 Oy_2 = new Oy_2() supports IY_3, IY_8,...etc;
      public int Y2 {...}
    }
    

    “supports”关键字(或等价物,例如“defaults”)将标识一个有序的类字段值列表,这些值“协助”实现一个或多个接口,使用接口的正常名称和签名映射语义姓名和签名对应。任何本地实现都具有优先权,并且单个接口也可以由多个字段值实现。

    【讨论】:

    • 我同意这将是一个有趣的功能......但我不确定 MS 是否会认为它足够有用以使其成为语言
    • 请参阅github.com/dotnet/roslyn/issues/13952,不幸的是,它已关闭,并提到可以使用 C#8 特征来实现,我认为这并不能真正充分解决问题。我认为它们的意思是,如果您有多个需要相同委托的类,则可以将特征混合到类中,这样您只需在一个地方编写和维护委托,但我宁愿不编写样板文件完全没有。
    猜你喜欢
    • 1970-01-01
    • 2019-08-05
    • 2020-11-10
    • 2011-05-03
    • 2023-03-29
    • 1970-01-01
    • 2023-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多