[英]foreach of IEnumerable<T> always calls non-generic Enumerator
[英]Add foreach (Enumerator, IEnumerable) to database model class for data validation
我正在嘗試在插入數據庫之前對我的數據執行數據驗證(空值檢查)。 我只是想對我的 DB model class 做一個 foreach 循環,如下所示:
foreach (var item in Insert)
{
if (item.value == null)
// do something
}
我已經嘗試了這個和這個的一些變體,但我似乎無法得到我想要的。 這是我到目前為止所擁有的。 在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 class 中的 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
}
所以我試圖向我的自定義 class 添加迭代。
一種方法是使用反射:
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; }
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.