3

我可能在这里缺少基本知识,但我会去问它。

假设我们有一个字符串数组:

ItemCode
ItemDescription

我们有一堂课:

public class InventoryItem
    {
        public string ItemCode { get; set; }
        public string ItemDescription { get; set; }
    }

我希望能够根据数组的值动态引用 InventoryItem 的属性。

我需要遍历数组并通过数组的当前字符串成员获取类的属性值。

我该怎么做?

4

2 回答 2

9

您使用反射:

foreach (var name in propertyNames)
{
    // Or instance.GetType()
    var property = typeof(InventoryItem).GetProperty(name);
    Console.WriteLine("{0}: {1}", name, property.GetValue(instance, null));
}

看:

于 2012-07-06T10:14:47.117 回答
1

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

于 2012-07-06T10:44:32.893 回答