我有一个实现枚举器的接口,类似于
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集合。
答案 0 :(得分:1)
您可以使用OfType<> Linq扩展方法,用于获取IClassExt
中collection
的实例。这允许IClass
和IClassExt
实例驻留在同一个集合中。
示例类和接口设置
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所涉及的工作是在构建应用程序时需要解决的问题。