【问题标题】:Make my Type work like a list让我的 Type 像列表一样工作
【发布时间】:2016-01-14 23:56:06
【问题描述】:

我已经创建了一个我自己类型的列表...(页面底部的自定义类型的类)

List<gridRecord> lgr = new List<gridRecord>();
lgr = populatedList();

我用下面的代码验证列表中的每个字段...(这工作正常!)

foreach (gridRecord gr in lgr)
{
    gr.Quantity.validate();
    gr.Title.validate();
    gr.Pages.validate();
    dt.Rows.Add(gr.Title.Value.ToString(), gr.Quantity.Value.ToString(), gr.Pages.Value.ToString());
}

但是,我将向 gridRecord 类添加新的 gridFields,并且不想更改正在验证的代码。

所以...我希望能够做这样的事情...

foreach (gridField gf in lgr)
{ 
    gf.Validate();
}

网格记录类...

class gridRecord : Validateit
{
    //Constructor
    public gridRecord()
    {
        Quantity = new quantityField();
        Title = new titleField();
        Pages = new pagesField();
    }
    private quantityField quantity;
    private titleField title;
    private pagesField pages;



    public quantityField Quantity
    {
        get { return quantity; }
        set { quantity = value; }
    }

    public titleField Title
    {
        get { return title; }
        set { title = value; }
    }

    public pagesField Pages
    {
        get { return pages; }
        set { pages = value; }
    }

    public override void Validate()
    {

    }
}

gridField 类...

class gridField : Validateit
{
    public gridField()
    {
        Value = "---";
        isValid = false;
        message = "";
    }

    private string value;
    protected bool isValid;
    private string message;


    public string Value
    {
        get { return this.value; }
        set { this.value = value; }
    }
    public bool IsValid
    {
        get { return isValid; }
        set { isValid = value; }
    }
    public string Message
    {
        get { return message; }
        set { message = value; }
    }

    public override void Validate()
    {

    }
}

如果需要,我是否需要使用IEnumerable

谢谢

【问题讨论】:

  • 您的代码真的难以阅读,因为它的格式都错误。无论如何 - Validateit 是接口还是基类?它是否定义了Validate 方法?
  • 我修复了格式不正确的类头。
  • 这与您的其他问题相似吗? stackoverflow.com/questions/33149703/…
  • @Jamiec 不想包含太多代码,验证方法工作正常,没有看到它是如何相关的。

标签: c# .net oop ienumerable ienumerator


【解决方案1】:

如果你想要这样的代码:

foreach (gridRecord gr in lgr)
{ 
    gr.Validate();
}

这是在 gridRecordValidate 方法中实现所需内容的简单案例(顺便说一句:该类应命名为 GridRecord - 根据 C# 命名约定,类应以大写字符开头)

class gridRecord : Validateit
{
    //.. snip
   public override void Validate()
   {
        this.Quantity.Validate();
        this.Title.Validate();
        this.Pages.Validate();
   }
}

但是,如果您想枚举所有字段,您可以让每个 gridRecord 实现 IEnumerable&lt;gridField&gt;,如下所示:

class gridRecord : Validateit, IEnumerable<gridField>
{
    //.. snip
   public IEnumerator<gridField> GetEnumerator()
   {
        yield return Quantity;
        yield return Title;
        yield return Pages;
   }

   public IEnumerator GetEnumerator()
   {
       return GetEnumerator(); // generic version
   }
}

然后你可以有这样的代码:

foreach (gridRecord gr in lgr) // enumerate each record
{ 
    foreach(gridField gf in gr) // enumerate each field within each record
    {
       gf.Validate();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    • 2019-09-09
    • 2013-10-14
    • 1970-01-01
    • 2015-09-23
    • 2011-06-18
    • 2012-10-02
    相关资源
    最近更新 更多