加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 在属性上实现IEnumerable

发布时间:2020-12-15 19:43:44 所属栏目:百科 来源:网络整理
导读:假设上课 public class Foo { public ListBar Bar = new ListBar(); public string Something; public TStatus Status;} Bar是一个定义为的类 public class Bar{ public string Code; public string Message; public TStatus Status;} 我需要迭代列表栏,但我
假设上课

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的代码块)并为你创建一个后备变量,并插入代码以从中读取并写入它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读