【问题标题】:Add foreach (Enumerator, IEnumerable) to database model class for data validation将 foreach (Enumerator, IEnumerable) 添加到数据库模型类以进行数据验证
【发布时间】:2021-03-15 19:15:28
【问题描述】:

我正在尝试在插入数据库之前对我的数据执行数据验证(空值检查)。我只是想对我的数据库模型类做一个 foreach 循环,如下所示:

foreach (var item in Insert)
{
    if (item.value == null)
    // do something
}

我尝试了this 和this 的一些变体,但我似乎无法得到我想要的。这是我到目前为止所拥有的。在 Main.cs

        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                var i = 0;
                var Insert = new MyItems();
                foreach (var item in Insert)
                {
                    i++;
                    Debug.WriteLine(i + ": " + item);
                    if (item.value == null)
                    // do something
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message);
            }
        }

在Model.cs

    public class MyItems : IEnumerable<MyItems>
    {
        List<MyItems> items = new List<MyItems>();

            public IEnumerator<MyItems> GetEnumerator()
        {
            foreach (var item in items)
                yield return item;
        }
        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }

        public string HandleUid { get; set; }
        public string TestSpin { get; set; }
        public string PartNumber { get; set; }
        public string LotNumber { get; set; }
        public string MachineName { get; set; }
// plus more items
     }

我也是这样做的,结果相同。

    public class MyItemList
    {

    }

    public class MyItems : IEnumerable<MyItemList>
    {

        List<MyItemList> items = new List<MyItemList>();

        public IEnumerator<MyItemList> GetEnumerator()
        {
            return items.GetEnumerator();
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }

        public string HandleUid { get; set; }
        public string TestSpin { get; set; }
        public string PartNumber { get; set; }
        public string LotNumber { get; set; }
        public string MachineName { get; set; }
//...

这只是一个测试程序。在我的真实应用程序中,将填充插入。当我运行它时, Insert 包含每个元素,但如果我进入 MyItems 类中的 foreach 循环,计数为零,我有点理解,但为什么 Insert 包含项目列表?我觉得我一直非常接近解决方案,但无法完成最后一英里。

因此,不必对许多项目执行此操作:

if (Myitems.HandleUid.Value === null)
//do something
if (Myitems.TestSpin.Value === null)
//do something
if (Myitems.PartNumber.Value === null)
//do something
if (Myitems.LotNumber.Value === null)
//do something
if (Myitems.MachineName.Value === null)
//do something
etc...

我想这样做:

foreach (var item in Myitems)
{
if (item.value == null)
// do something
}

所以我正在尝试向我的自定义类添加迭代。

【问题讨论】:

  • 我对你的模型类感到困惑。为什么MyItems 包含List&lt;MyItems&gt;?它是一个递归结构吗?
  • 不一定。我正在寻求一些指导,也许这是错误的处理方式!
  • 我无法指导您,因为我无法告诉您您要完成什么。您说您正在尝试检查模型是否存在空值,但代码中的任何地方甚至都没有空值检查。
  • 你必须明白,OP,当你说“让 foreach 工作”时,我一点也不知道“工作”是什么意思。您的示例是完全模棱两可的MyItem,这无济于事。您是否尝试迭代记录、属性或其他内容?
  • 所以基本上你想检查你的类上的每个 property 以确保它不为空,你想通过 foreach 而不是而不是单独列出它们?您正在寻找反思,但我建议您不要以初学者的身份走这条路。将它们单独列出并继续。

标签: c# ienumerable


【解决方案1】:

一种方法是使用反射:

void Main()
{
    var item = new MyItem() 
    {
        PartNumber = "1",
        LotNumber = "2"
    };
    
    var properties = typeof(MyItem).GetProperties(BindingFlags.Instance | BindingFlags.Public).Select(x => (Value: x.GetValue(item), Name: x.Name));
    foreach (var p in properties)
    {
        if(p.Value == null)
            Console.WriteLine($"Property {p.Name} is null");
    }
}

public class MyItem
{
    public string HandleUid { get; set; }
    public string TestSpin { get; set; }
    public string PartNumber { get; set; }
    public string LotNumber { get; set; }
    public string MachineName { get; set; }
}

【讨论】:

  • 谢谢!我实际上在我的应用程序中使用反射来做其他事情,但我坚持添加 IEnumerable 的想法。正是我需要的!
猜你喜欢
  • 2019-07-03
  • 1970-01-01
  • 2019-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
相关资源
最近更新 更多