想要 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);
}
您在 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