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

3

我需要将一个列表转换成字典。在c#中,可以使用以下语法来完成:

var dictionary = myList.ToDictionary(e => e.Id);

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

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

所以我需要基本上创建这个字符串"c => e.Id"到一个Func,但我不确定参数是什么用于什么对象。

到目前为止,我有这个

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;
}

希望擅长表达式的专家能够提供帮助。

先行致谢。


也许你可以看一下dynamic linq。它可能正是你所需要的东西。 - Mats391
1
在测试程序中编写 Expression<Func<SomeType, bool>> tmp = x => x.SomeProperty;,您将能够在调试器中查看 tmp 对象,这将帮助您找出所需的部分。另外,如果您想要创建一个表达式,为什么函数是 <T, bool>?我会期望是 <TKey, TValue> - Scott Chamberlain
1
请纠正我是否误解了问题,但如果您知道包含键值的属性名称,那么有什么阻止您执行类似于 var dictionary = myList.ToDictionary(e => e.GetType().GetProperty(propName).GetValue(e)); 的操作呢? - Innat3
你能否提供一个调用该方法的示例? - Connell.O'Donnell
@Innat3 这本来是个好方法,但我的一些对象有多个keyName属性。否则这个方法就完美了。 - Gillardo
@user2736022 那在这些情况下,你会如何构建字典键?通过将这些属性的值连接成一个字符串吗? - Innat3
2个回答

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;
}

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);
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接