循环遍历没有reflection的对象属性
我有MyModel类和MyModel的一些对象。
我需要没有reflection的对象的for循环或foreach属性。 如何实施?
类示例:
public class MyModel { public string Level1_TypeName { get; set; } public string Level1_AttrType { get; set; } public string Level1_AttrValue { get; set; } public string Level2_TypeName { get; set; } public string Level2_AttrType { get; set; } public string Level2_AttrValue { get; set; } public string Level3_TypeName { get; set; } public string Level3_AttrType { get; set; } public string Level3_AttrValue { get; set; } public string Level4_TypeName { get; set; } public string Level4_AttrType { get; set; } public string Level4_AttrValue { get; set; } public string Level5_TypeName { get; set; } public string Level5_AttrType { get; set; } public string Level5_AttrValue { get; set; } public string Level6_TypeName { get; set; } }
我强烈建议你采取两个行动:
- 创建一个新类型以封装
TypeName
,AttrType
,AttrValue
的组合 - 更改模型以包含该类的集合,而不是几个单独的属性。
那时,在不使用reflection的情况下迭代属性将非常容易……并且您的代码也将更加清晰。
您可以使用reflection来创建包含所有值的字典:
var obj = new MyModel(); var dictionary = obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance).ToDictionary(p => p.Name, p => p.GetGetMethod().Invoke(obj, null)); foreach (var kv in dictionary) Console.WriteLine(kv.Key + ": " + kv.Value ?? "null");
但我建议你阅读并使用Jon Skeet的答案
如果您不想使用reflection,则无法遍历对象属性。
您可以在模型中使用一些reflection来实现不可数:
public class MyModel : IEnumerable> { public string Level1_TypeName { get; set; } public string Level1_AttrType { get; set; } public string Level1_AttrValue { get; set; } public string Level2_TypeName { get; set; } public string Level2_AttrType { get; set; } public string Level2_AttrValue { get; set; } public string Level3_TypeName { get; set; } public string Level3_AttrType { get; set; } public string Level3_AttrValue { get; set; } public string Level4_TypeName { get; set; } public string Level4_AttrType { get; set; } public string Level4_AttrValue { get; set; } public string Level5_TypeName { get; set; } public string Level5_AttrType { get; set; } public string Level5_AttrValue { get; set; } public string Level6_TypeName { get; set; } public IEnumerator> GetEnumerator() { return this.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance).ToDictionary(p => p.Name, p => p.GetGetMethod().Invoke(this, null)).GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { throw new NotImplementedException(); } }
然后你可以像这样使用你的类:
var obj = new MyModel(); foreach(var kv in obj) Console.WriteLine(kv.Key + ": " + kv.Value ?? "null");
如果您希望避免reflection,那么您将不得不手动编写代码。 您可以添加一个返回枚举器的方法:
IEnumerable> GetLevels() { yield return Tuple.Create(1, Level1_TypeName, Level1_AttrType, Level1_AttrValue); yield return Tuple.Create(2, Level2_TypeName, Level2_AttrType, Level2_AttrValue); yield return Tuple.Create(3, Level3_TypeName, Level3_AttrType, Level3_AttrValue); yield return Tuple.Create(4, Level4_TypeName, Level4_AttrType, Level4_AttrValue); yield return Tuple.Create(5, Level5_TypeName, Level5_AttrType, Level5_AttrValue); yield return Tuple.Create(6, Level6_TypeName, Level6_AttrType, Level6_AttrValue); }
现在你可以说:
foreach(var i in myModel.GetLevels()) { Console.WriteLine("{0},{1},{2},{3}",i.Item1,i.Item2,i.Item3,i.Item4); }