【问题标题】:C# - Is it possible to extend an existing built-in class with a new InterfaceC# - 是否可以使用新接口扩展现有的内置类
【发布时间】:2009-11-25 18:21:24
【问题描述】:

我刚刚学习 C#,现在遇到了问题。 :-) 在 C++ 中,我喜欢使用“const reference”作为参数来避免这种情况 被调用的方法改变了我传递的对象。

我在某个地方读到了我可以做某事的地方。通过使用接口在 C# 中类似。 在界面中,我将放置一些“getter”以允许该方法进行只读访问 到我的对象。

现在猜想,我想将我的 C# 方法传递给像“List”这样的内置容器。 但我想避免该方法更改该列表中的某些内容。 只读!

我的第一个想法是: - 我创建了一个名为 IMyOwnInterface 的新接口,它也使用 IList 接口

  • 我的新接口 IMyOwnInterface 仅包含“getter”

  • 我把方法改成……像这样 MyLittleMethod(IMyOwnInterface if)

  • 现在“MyLittleMethod”方法只能看到“getter”,我把它放在自己的界面中,而不是 IList 的“setter”

这可能吗? 有人可以给我一个提示吗?

【问题讨论】:

    标签: c# interface reference constants


    【解决方案1】:

    【讨论】:

    • IList 没有 AsReadOnly 方法。
    • @Miriam:如果它是 C# 3 中的 IList,则可以使用 list.ToList().AsReadOnly()。
    • 您始终可以使用IList<T> readOnlyList = new ReadOnlyCollection<T>(mutableList); 为原始列表创建访问包装器(对原始列表的更改将反映在只读列表中)。
    • @Lucero ReadOnlyCollection 仅适用于 List 但如果我想使用 Dictionary 怎么办?
    • @mrbamboo:blackwasp.co.uk/ReadOnlyDictionary.aspx。在 Google 上很容易找到。
    【解决方案2】:

    是的,我相信这会奏效。试一试,让我们知道它是如何工作的:D

    【讨论】:

      【解决方案3】:

      答案是否定的:

      IList 没有实现 IMyOwnInterface 所以你不能转换它。

      IList list = ...
      MyLittleMethod((IMyOwnInterface)list)    // Compiler errror here
      

      在这种情况下,您可以使用 ReadOnlycollection:

      IList list = ...
      MyLittleMethod(new ReadOnlyCollection(list))
      

      【讨论】:

      • 我现在使用 ReadOnlyCollection 来处理 List but Dictionaries 的情况?字典没有 ReadOnly...,对吧?
      【解决方案4】:

      对于接口,它基本上只能通过继承或使用一些代理的东西(通过适配器类显式,通过 RealProxy 实现,或使用库来做类似的事情,如 LinFu)。

      但是,开箱即用,您可以使用委托对具有匹配签名的单个方法进行后期绑定。

      【讨论】:

      • 非常复杂,尤其是对于初学者。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-25
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多