在我的Windows应用商店应用中,我使用了c#5.0。我需要通过传递子类的集合来调用接收基类的方法:
public class Foo // base class
{
public int fooVariable = 1;
public void fooMethod(){....};
}
public class Bar:Foo // child class
public void DoSomething(Foo foo)
public void DoSomething(List<Foo> foos)
{
foreach (var foo in foos)
{
Debug.WriteLine(foo.i); //access to variable
foo.fooMethod(); //access to method
foo.i = 10; //!!!i can change variable!!!
}
}
private List<Bar> _list;
public void Call()
{
DoSomething(new Bar()); // ok
_list = new List<Bar>();
list.Add(new Bar()); // I can add a lot of items.
DoSomething(list); // not ok
foreach (var foo in foos)
{
Debug.WriteLine(foo.i); // in console I need to see '10'
}
}
是否有可能规避这种限制?如果是 - 怎么样?
UPD
在DoSomething
我需要对所有公共方法/变量(读/写)/属性(读/写)的完全访问权限
答案 0 :(得分:2)
看起来DoSomething(List<Foo> foos)
实际上只需要迭代列表。所以你可以把它改成:
public void DoSomething(IEnumerable<Foo> foos)
{
// Body as before
}
现在您可以将List<Bar>
传递给该方法,因为IEnumerable<T>
中的T
为covariant。