想要 Func 参数名称而不是值,存储在字典中

本文关键字:存储 字典 参数 Func 想要 | 更新日期: 2023-09-27 18:34:58

我有存储函数的字典。在存储 Func ( testDir.Add(1, p => p.Id( 时,它很好。当我从字典中获取 Func 时,我想要存储在 Func 中的属性名称 (Id(。我试过从lambda表达式中检索属性名称使用此链接的 lambda 表达式获取属性名称和类型。它在简单的 Func 中工作。 但是使用字典,我在 GetMemberInformation 中获得了成员 = null。

 public static MemberInfo GetMemberInfo<T, U>(Expression<Func<T, U>> expression)
    {
        var member = expression.Body as MemberExpression;
        if (member != null)
            return member.Member;
        throw new ArgumentException("Expression is not a member access", "expression");
    }

static void Main(string[] args)
        {
            Dictionary<int, Func<Soure.Employee, int>> testDir = new Dictionary<int, Func<Soure.Employee, int>>();
            testDir.Add(1, p => p.Id);
            var testDirValue = testDir[1];
            Expression<Func<Soure.Employee, int>> expr1 = mc => testDirValue(mc);
            MemberInfo member = Program.GetMemberInfo(expr1);
            Console.WriteLine(member.Name);
        }

想要 Func 参数名称而不是值,存储在字典中

您在 expr1 中的表达式实际上并没有保存 p => p.Id 的表达式树。它保存 lambda mc => testDirValue(mc) 的表达式树,这是一个由对不透明委托的调用组成的表达式。无法从第二个 lambda 获取有关访问了哪个属性的信息。

所需信息将编码为 lambda 文字语法。一旦它作为任意委托被存储和检索,此信息将不再可用。您真正想做的是将Expression<Func<Soure.Employee, int>>存储在字典中,以便从添加到字典中的 lambda 构建表达式树:

var testDir = new Dictionary<int, Expression<Func<Soure.Employee, int>>>();
testDir.Add(1, p => p.Id);
MemberInfo member = GetMemberInfo(testDir[1]);
Console.WriteLine(member.Name); // Id