c# – 在属性上实现IEnumerable
假设上课
public class Foo { public List<Bar> Bar = new List<Bar>(); public string Something; public TStatus Status; } Bar是一个定义为的类 public class Bar { public string Code; public string Message; public TStatus Status; } 我需要迭代列表栏,但我不能使用foreach因为我需要实现IEnumerable我是一个新手,我很难解决如何实现它,任何帮助赞赏. 解决方法
有几件事:
1.)至于你的实际问题,你有两个选择: 您可以在代码中迭代Bar字段(或属性,如果您将其更改为属性,如下所述): Foo foo = new Foo(); foreach(Bar bar in foo.Bar) { ... } 或者你可以让Foo实现IEnumerable< Bar> (这更复杂): public class Foo : IEnumerable<Bar> { .. your existing code goes here public IEnumerator<Bar> GetEnumerator() { return Bar.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return Bar.GetEnumerator(); } } 这将允许您这样做: Foo foo = new Foo(); foreach(Bar bar in foo) { } 就个人而言,我会推荐第一个选项.它更简单,除非Foo真的是(而不仅仅是)Bar对象的集合,否则它看起来更直观. 2.)你上面所拥有的不是属性,而是公共领域.一个属性有一个getter和一个setter,看起来像这样: public class Foo { public string Something { get { return ...; } set { ... = value; } } } 属性通常在单个变量上运行,称为后备存储.对于上面的属性,这样的事情: public class Foo { private string something; public string Something { get { return something; } set { something = value; } } } 严格来说,你可以放置任何在get块中返回一个字符串的代码块,你可以在set block中放置任何东西(包括什么,虽然这不是一个好主意). 属性允许您定义行为类似于字段的内容(因为您可以使用等号分配它),但使用您在检索或设置其值时指定的行为.但是,具有非常简单属性的问题之一(只是直接获取/设置后备变量而没有任何其他逻辑)是它实际上做的有点冗长.这就是为什么C#3.0引入了自动属性的概念,如下所示: public class Foo { public string Something { get; set; } } 在这里,Something看起来有点像一个领域,但它实际上是一个属性. C#编译器识别这种语法(用分号替换get和set的代码块)并为你创建一个后备变量,并插入代码以从中读取并写入它. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |