[英]How to get class elements dynamically in c#
我可能在这里缺少基本知识,但我会去询问。
假设我们有一个字符串数组:
ItemCode
ItemDescription
我们有一堂课:
public class InventoryItem
{
public string ItemCode { get; set; }
public string ItemDescription { get; set; }
}
我希望能够基于数组的值动态引用InventoryItem的属性。
我需要遍历数组,并通过数组的当前字符串成员获取类的属性值。
我该怎么做?
您使用反射:
foreach (var name in propertyNames)
{
// Or instance.GetType()
var property = typeof(InventoryItem).GetProperty(name);
Console.WriteLine("{0}: {1}", name, property.GetValue(instance, null));
}
看到:
乔恩·斯凯特(Jon Skeet)的答案是绝对正确的(他还有其他类型吗?),如果您需要动态访问1000个InventoryItem对象,它的效果很好。 但是,如果您需要动态访问更多的对象(例如1000万个),则反射开始会非常缓慢。 我有一小会儿我创建的帮助程序类,该类可以通过创建和编译访问属性的动态方法来轻松地以比反射快26倍的速度访问属性(至少在我的计算机上)。 它远没有达到静态访问的速度快,但是由于您需要动态访问它,因此甚至无需考虑。 使用方法如下:
var accessor = new DynamicPropertyAccessor(typeof(InventoryItem).GetProperty("ItemCode"));
foreach (var inventoryItem in warehouse13)
{
Console.WriteLine("{0}: {1}", accessor.Name, accessor[inventoryItem]);
}
您还可以使用它来设置值: accessor[item] = "newValue"
。 如果需要动态访问多个属性,则可以具有访问器的集合。 当您为每个属性创建一次DynamicPropertyAccessor
用于访问许多对象(或多次访问同一对象)时,性能将得到显着提高。
我在这里发布了DynamicPropertyAccessor
类: https : //gist.github.com/3059427
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.