2009-11-25 73 views
1

我只是学习C#,我现在有一个问题。 :-) 在C++中,我喜欢使用“const引用”作为参数,以避免被调用的方法更改我传递的对象。C# - 是否有可能扩展一个新的接口现有的内置类

我在某处读过我可以做的事情。通过使用接口在C#中类似。 在接口中,我只是放一些“getters”来允许该方法只读取 到我的对象。

现在猜测,我想通过我的C#方法一个内置的容器,如“列表”。 但我想避免该方法改变该列表中的某些东西。 只需阅读!

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

  • 我的新界面IMyOwnInterface只包含“干将”

  • 我改变我方法。这样MyLittleMethod(IMyOwnInterface如果)

  • 现在的方法“MyLittleMethod”才可以看到的“干将”,我把我自己的接口和IList的

    的不是“二传手”

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

回答

1

是的,我相信会有效果。给它一个镜头,并让我们知道它是如何工作的:d

0

答案是否定的:

IList中没有实现IMyOwnInterface所以你不能施放它。

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

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

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

我现在用的ReadOnlyCollection的名单,但词典的情况下? 没有ReadOnly ... for Dictionaries,对不对? – mrbamboo 2009-12-02 16:26:06

0

有了接口,它基本上只能通过继承或与一些代理的东西(或者与适配器类明确,通过RealProxy实现,或有图书馆来做这种事情,比如林馥)。

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

+0

非常复杂,尤其对于初学者。 – 2009-11-25 18:29:06

3
+0

IList没有AsReadOnly方法。 – 2009-11-25 18:27:57

+1

@Miriam:如果它是C#3中的IList ,那么可以使用list.ToList()。AsReadOnly()。 – TrueWill 2009-11-25 19:05:05

+3

你总是可以做一个'IList readOnlyList = new ReadOnlyCollection (mutableList);'它为原始列表创建一个访问包装(对原始列表的更改将反映在只读列表中)。 – Lucero 2009-11-25 19:08:35

相关问题