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オブジェクトに動的にアクセスする必要がある場合にうまく機能します。しかし、より多くのオブジェクト、たとえば1,000万に動的にアクセスする必要がある場合、反射は非常に遅くなり始めます。少し前に作成したヘルパークラスがあり、プロパティにアクセスするための動的メソッドを作成してコンパイルすることで、リフレクションよりも約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プロパティごとに1回作成し、再利用して多くのオブジェクト(または同じオブジェクトに何度もアクセス)にアクセスすると、パフォーマンスが大幅に向上します。

DynamicPropertyAccessorここにクラスを投稿しました: https ://gist.github.com/3059427

于 2012-07-06T10:44:32.893 に答える