タイプのアイテムを保持する特殊なリストがありますIThing:
public class ThingList : IList<IThing>
{...}
public interface IThing
{
Decimal Weight { get; set; }
Decimal Velocity { get; set; }
Decimal Distance { get; set; }
Decimal Age { get; set; }
Decimal AnotherValue { get; set; }
[...even more properties and methods...]
}
リスト内のすべてのものの特定のプロパティの最大値または最小値を知る必要がある場合があります。「聞かないでください」という理由で、リストにそれを理解させます。
public class ThingList : IList<IThing>
{
public Decimal GetMaximumWeight()
{
Decimal result = 0;
foreach (IThing thing in this) {
result = Math.Max(result, thing.Weight);
}
return result;
}
}
とてもいいですね。しかし、最小重量が必要な場合もあれば、最大速度が必要な場合もあります。GetMaximum*()/GetMinimum*()すべてのプロパティにペアは必要ありません。
解決策の 1 つは反射です。次のようなもの (鼻をほじって、コードの匂いが強い!):
Decimal GetMaximum(String propertyName);
Decimal GetMinimum(String propertyName);
これを達成するためのより良い、臭いの少ない方法はありますか?
ありがとう、エリック
編集: @Matt: .Net 2.0
結論: .Net 2.0 (Visual Studio 2005 を使用) にはこれ以上の方法はありません。近いうちに .Net 3.5 と Visual Studio 2008 に移行する必要があるかもしれません。みんなありがとう。
結論: リフレクションよりもはるかに優れたさまざまな方法があります。ランタイムと C# のバージョンによって異なります。違いについては、Jon Skeetsの回答をご覧ください。どの回答も大変参考になります。
Sklivvz の提案 (匿名の方法) に行きます。Sklivvz のアイデアを実装する他の人々 (Konrad Rudolph、Matt Hamilton、および Coincoin) からのコード スニペットがいくつかあります。残念ながら、私は1つの答えしか「受け入れる」ことができません。
どうもありがとうございました。Sklivvzだけがクレジットを取得しますが、誰もが「受け入れられた」と感じることができます;-)