5

I'm having a trouble defining a Dictionary for quick accessing Lambda Expressions.

Let's suppose we have a well-known class like this:

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

What a want to do is something like this:

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

Is this possible?

Edit:

This is my use case for this object:

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

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

array.Sort(getters[sortField]);

Many thanks for your help.

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是输入的类型,第二个泛型类型参数是输出的类型(使用object是因为您有不同的输出类型)。更多关于FuncFunc<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 Gravelldynamic order by提供的答案

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

不需要 lambda,只需直接访问数据即可。

正如大家所说,您需要将成员公开。我建议您将其更改为以下内容:

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