5

ラムダ式にすばやくアクセスするためのディクショナリの定義に問題があります。

次のような有名なクラスがあるとします。

class Example
{
    public string Thing1;
    public DateTime Thing2;
    public int Thing3;
}

やりたいことは次のようなものです:

var getters = new Dictionary<string, IDontKnowWhatGoesHere>();
getters.Add("Thing1", x => x.Thing1);
getters.Add("Thing3", x => x.Thing3);

これは可能ですか?

編集:

これは、このオブジェクトの私の使用例です:

List<Example> array = new List<Example>();

// We actually get this variable set by the user
string sortField = "Thing2";

array.Sort(getters[sortField]);

助けてくれて本当にありがとうございます。

4

4 に答える 4

8

いくつかのオプションがあります。あなたの例のように、取得したいものがすべて同じタイプ(つまりString)の場合、次のことができます

var getters = new Dictionary<string, Func<Example, String>>();

ただし、タイプが異なる場合は、最も低い共通サブクラスを使用する必要があります。ほとんどの場合、次のようになりますObject

var getters = new Dictionary<string, Func<Example, object>>();

その後、戻り値を期待される型にキャストする必要があることに注意してください。

于 2013-07-30T13:34:06.210 に答える
3

試す:

var getters = new Dictionary<string, Func<Example, object>>();
getters.Add("Thing1", x => x.Thing1);
getters.Add("Thing3", x => x.Thing3);

デリゲートの最初のジェネリック型パラメーターはFunc入力の型で、2 番目のジェネリック型パラメーターは出力の型です (object出力の型が異なるため使用します)。詳細Func:Func<T, TResult>デリゲート

于 2013-07-30T13:31:31.250 に答える
3
var getters = new Dictionary<string, Expression<Func<Example, object>>>();

ただし、string Thing1公開する必要があります。

于 2013-07-30T13:31:39.210 に答える
1

私はあなたがこれについて間違った方法で考えていると本当に思います。なぜ辞書を使うのですか?クラス定義が正しい場合は、List<Example>.

List<Example> dataList = new List<Example>();
dataList.Add(new Example { Thing1 = "asdf", Thing2 = "qwert", Thing3 = 2 });

次に、その上でlinqを使用できます。

IEnumerable<Example> sortedByT3 = dataList.OrderBy(x => x.Thing3);

sortedByT3.Last().Thing2 = "hjkl";

Marc Gravell's answerdynamic order byが提供するを使用することもできます。

var sortedByString = dataList.AsQueryable().OrderBy("Thing2");

ラムダは必要ありません。データに直接アクセスするだけです。

皆さんがおっしゃる通り、メンバーを公開する必要があります。次のように変更することをお勧めします。

public class Example
{
    public string Thing1 { get; set; }
    public string Thing2 { get; set; }
    public int Thing3 { get; set; }
}
于 2013-07-30T13:45:04.360 に答える