范围界面

时间:2015-10-15 18:33:56

标签: c#

我有一个实现枚举器的接口,类似于

foreach(IClass i in collection)
{

}

我无法访问IClass或集合的代码,因为它位于我正在构建的库中。现在我想向IClass添加属性。我一直在尝试的是

public class IClassExt : IClass 
{
    ... IClass properties
    ... additional properties
}

但是现在我无法弄清楚当我调用

时如何获得IClassExt
 foreach(IClassExt i in collection)
{
}

我尝试了从IClass到IClassExt的转换,但这是不允许的,即使它工作也是如此,如果我每次使用循环时都必须这样做,那就太费时了。我需要能够将我的所有IClass实现为IClassExt一次,并使我的集合成为IClassExt集合而不是IClass集合。

3 个答案:

答案 0 :(得分:1)

您可以使用OfType<> Linq扩展方法,用于获取IClassExtcollection的实例。这允许IClassIClassExt实例驻留在同一个集合中。

示例类和接口设置

public interface IClass{
    string ClassName {get;set;}
    bool IsValid {get;set;}
}
public interface IClassExt:IClass{
    string SuperiorClassName {get;set;}
}
public class Foo: IClass{
    public string ClassName {get;set;}
    public bool IsValid {get;set;}
}
public class Bar: IClassExt{
    public string ClassName {get;set;}
    public bool IsValid {get;set;}
    public string SuperiorClassName {get;set;}  
}

用法:

var collection = new IClass[]{new Foo{ClassName = "MyFooClass", IsValid=true}, new Bar{ClassName="MyBarClass", IsValid=false, SuperiorClassName = "MySuperiorFooBarClass"}};
foreach (IClassExt classExt in collection.OfType<IClassExt>()){
    //Do something really cool here
}

答案 1 :(得分:0)

看看是否有效:

var iClassCollection = collection.Select(c=> (ICollectionExt)c).ToList();

foreach(IClassExt i in iClassCollection)
{
   // ... 
}

答案 2 :(得分:0)

您声明以下内容:

  

我无法访问IClass或集合的代码,因为它位于我正在构建的库中。

但是:

  

我需要能够将我的所有IClass实现为IClassExt一次,并使我的集合成为IClassExt集合而不是IClass集合。

如果您没有该集合的来源,那么您就无法将其作为IClassExt的集合。它将始终是IClass的集合,但COULD包含IClassExt,与List可以包含字符串(或从对象继承的任何其他内容)的方式相同。假设您的集合中的所有内容都是IClassExt是不安全的,因为虽然您可以保证每个IClassExt也是一个IClass,但您不能保证每个IClass都是IClassExt,即使您亲自以这种方式编写了所有代码,你不能确定下一个处理代码的人不会决定将其他一些IClass对象抛入集合中。这意味着,为了安全地编码,您必须测试集合中的对象是否为IClassExt。

使用&#34; OfType&#34;另一个答案中引用的扩展方法是确保访问集合时的安全性的好方法。另一种可能性是使用包装类来插入和访问集合。

在我看来,最好的选择就是创建自己的IClassExt集合并使用它。更改所有代码以使用IClassExt而不是IClass所涉及的工作是在构建应用程序时需要解决的问题。