繁体   English   中英

如何在C#中动态获取类元素

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM