在 C# 中遍历对象属性
Iterating through Object Properties in C#
我有一个客户类型对象列表,当我遍历该列表时,我希望能够遍历每个客户的属性。然后我想将 属性 值作为字符串打印出来。我收到 WhosebugException 错误。
让我先说一下:
- 这只是一个 class 库,我从其他地方调用函数并且调用有效。
- 对数据库的调用及其中的信息 returns 是正确的(我在尝试遍历属性之前对其进行了测试)
- 我的最终目标是将客户列表转换为二维数组,其中每列代表一个客户,每行代表客户属性。
提前致谢!
using Dapper;
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Xml.Linq;
using System.Reflection.Emit;
using System.Reflection;
using System.Collections;
namespace AtoCLib
{
public class DataAccessLayer
{
public static List<Customer> GetCustomerList(string startChar)
{
string sql = $"SELECT TOP (10) P.LastName, [CustomerID],[PersonID] ,[StoreID] ,[TerritoryID] ,[AccountNumber] FROM [AdventureWorks2017].[Sales].[Customer] C INNER JOIN [Person].[Person] P ON C.CustomerID = P.BusinessEntityID WHERE P.LastName >= '{startChar}'";
List<Customer> CustomerList = new List<Customer>();
try
{
using (var connection = new SqlConnection("Data Source=SHCP-2035;Initial Catalog=AdventureWorks2017;Integrated Security=True"))
{
var Customers = connection.Query<Customer>(sql).AsList();
foreach (Customer customer in Customers)
{
CustomerList.Add(customer);
}
}
}
catch (Exception e)
{
Console.Write(e);
}
return CustomerList;
}
public static void getCustListArray(string nameChar)
{
List<Customer> list = GetCustomerList(nameChar);
string[,] customerArray = new string[10, 6];
foreach (Customer customerObj in list)
{
Customer tempCustomer = new Customer();
tempCustomer = customerObj;
foreach (PropertyInfo property in tempCustomer)
{
Console.WriteLine(property.GetValue(tempCustomer));
}
}
}
}
public class Customer : IEnumerable<PropertyInfo>
{
public int CustomerID { get; set; }
public int? PersonID { get; set; }
public int? StoreID { get; set; }
public int? TerritoryID { get; set; }
public string AccountNumber { get; set; }
public string lastName { get; set; }
public IEnumerator<PropertyInfo> GetEnumerator()
{
return GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
}
错误是:
Process is terminated due to WhosebugException.
public IEnumerator<PropertyInfo> GetEnumerator()
{
return GetEnumerator();
}
此方法正在调用自身,最终您的堆栈将溢出。正确实施:
public IEnumerator<PropertyInfo> GetEnumerator()
{
foreach (var property in typeof(Customer).GetProperties())
{
yield return property;
}
}
是的,您收到此错误是因为您的方法 Customer.GetEnumerator()
调用自身然后再次调用,并且它创建了无限递归。要获取对象的所有 public 属性,请在此方法中使用以下代码:
return this.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
但是,我认为这不是在 GetEnumerator()
方法中执行此操作的正确方法。您的 class 不是集合或类似的东西。因此,直接从方法 getCustArray()
:
使用方法 GetProperties()
foreach (PropertyInfo property in tempCustomer.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance))
{
Console.WriteLine(property.GetValue(tempCustomer));
}
我有一个客户类型对象列表,当我遍历该列表时,我希望能够遍历每个客户的属性。然后我想将 属性 值作为字符串打印出来。我收到 WhosebugException 错误。
让我先说一下:
- 这只是一个 class 库,我从其他地方调用函数并且调用有效。
- 对数据库的调用及其中的信息 returns 是正确的(我在尝试遍历属性之前对其进行了测试)
- 我的最终目标是将客户列表转换为二维数组,其中每列代表一个客户,每行代表客户属性。
提前致谢!
using Dapper;
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Xml.Linq;
using System.Reflection.Emit;
using System.Reflection;
using System.Collections;
namespace AtoCLib
{
public class DataAccessLayer
{
public static List<Customer> GetCustomerList(string startChar)
{
string sql = $"SELECT TOP (10) P.LastName, [CustomerID],[PersonID] ,[StoreID] ,[TerritoryID] ,[AccountNumber] FROM [AdventureWorks2017].[Sales].[Customer] C INNER JOIN [Person].[Person] P ON C.CustomerID = P.BusinessEntityID WHERE P.LastName >= '{startChar}'";
List<Customer> CustomerList = new List<Customer>();
try
{
using (var connection = new SqlConnection("Data Source=SHCP-2035;Initial Catalog=AdventureWorks2017;Integrated Security=True"))
{
var Customers = connection.Query<Customer>(sql).AsList();
foreach (Customer customer in Customers)
{
CustomerList.Add(customer);
}
}
}
catch (Exception e)
{
Console.Write(e);
}
return CustomerList;
}
public static void getCustListArray(string nameChar)
{
List<Customer> list = GetCustomerList(nameChar);
string[,] customerArray = new string[10, 6];
foreach (Customer customerObj in list)
{
Customer tempCustomer = new Customer();
tempCustomer = customerObj;
foreach (PropertyInfo property in tempCustomer)
{
Console.WriteLine(property.GetValue(tempCustomer));
}
}
}
}
public class Customer : IEnumerable<PropertyInfo>
{
public int CustomerID { get; set; }
public int? PersonID { get; set; }
public int? StoreID { get; set; }
public int? TerritoryID { get; set; }
public string AccountNumber { get; set; }
public string lastName { get; set; }
public IEnumerator<PropertyInfo> GetEnumerator()
{
return GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
}
错误是:
Process is terminated due to WhosebugException.
public IEnumerator<PropertyInfo> GetEnumerator() { return GetEnumerator(); }
此方法正在调用自身,最终您的堆栈将溢出。正确实施:
public IEnumerator<PropertyInfo> GetEnumerator()
{
foreach (var property in typeof(Customer).GetProperties())
{
yield return property;
}
}
是的,您收到此错误是因为您的方法 Customer.GetEnumerator()
调用自身然后再次调用,并且它创建了无限递归。要获取对象的所有 public 属性,请在此方法中使用以下代码:
return this.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
但是,我认为这不是在 GetEnumerator()
方法中执行此操作的正确方法。您的 class 不是集合或类似的东西。因此,直接从方法 getCustArray()
:
GetProperties()
foreach (PropertyInfo property in tempCustomer.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance))
{
Console.WriteLine(property.GetValue(tempCustomer));
}