使用字符串表达式将列表转换为字典c#

时间:2017-02-24 14:34:09

标签: c# entity-framework dictionary lambda expression

我需要将列表转换为字典。这可以通过使用以下语法

在c#中完成
var dictionary = myList.ToDictionary(e => e.Id);

我不知道id字段的名称,因为我正在创建一些代码来迭代对象及其子对象/列表并将它们附加到我的dbcontext。

我已经有代码来确定作为我的键值的属性的名称,但是对于测试,我只能使用“Id”(其他可能不同)

所以我需要基本上将这个字符串“c => e.Id”创建为Func,但我不确定哪些参数适用于Expression个对象。

到目前为止我有这个

public static Expression<Func<T, bool>> strToFunc<T>(string propName)
{
    Expression<Func<T, bool>> func = null;

        var prop = typeof(T).GetProperty(propName);
        ParameterExpression tpe = Expression.Parameter(typeof(T));
        var left = Expression.Property(tpe, prop);


    return func;
}

表达专家的人会非常感谢你的帮助。

提前致谢

2 个答案:

答案 0 :(得分:0)

如果我理解你的问题,我就是这样做的,希望如果不这样做会有所帮助。

public static Dictionary<object, TValue> GenericToDictionary<TValue>(this IEnumerable<TValue> source, string propName)
{
    Dictionary<object, TValue> result = new Dictionary<object, TValue>();
    foreach (var obj in source)
    {
        result[obj.GetType().GetProperty(propName).GetValue(obj)] = obj;
    }
    return result;
}

答案 1 :(得分:0)

如果您将属性名称作为字符串,则可以尝试此操作。

public static Dictionary<string, T> ListToDictionary<T>(string propertyName, List<T> list)
    {
        Func<T, string> func = obj => typeof(T).GetProperty(propertyName).GetValue(obj) as string;
        return list.ToDictionary(func);
    }

否则你可以将表达式传递给lambda:

class Person
    {
        public int ID { get; set; }
        public string Name { get; set; }
    }

    public static void DoSomething()
    {
        var people = new List<Person>();
        var dict = people.ToDictionary(p => p.ID);
    }