【发布时间】:2013-08-01 13:42:21
【问题描述】:
我需要将表示接口上的属性名称的字符串转换为表达式。我已经完成了大部分工作,最后只有一件我无法弄清楚。
static Expression<Func<T, int>> MakeGetter<T>(string propertyName)
{
var input = Expression.Parameter(typeof(T));
var property = typeof(T).GetProperty(propertyName) ??
GetProperty(propertyName, typeof(T));
var expr = Expression.Property(input, property);
var propType = property.PropertyType.Name;
switch (propType.ToLower())
{
case "string":
return Expression.Lambda<Func<T, string>>(expr, input);
case "int":
return Expression.Lambda<Func<T, int>>(expr, input);
}
}
private static PropertyInfo GetProperty(string propertyName, Type i)
{
var baseInterfaces = i.GetInterfaces();
foreach (var baseInterface in baseInterfaces)
{
var property = baseInterface.GetProperty(propertyName);
return property ?? GetProperty(propertyName, baseInterface);
}
return null;
}
我遇到的一个问题是在 MakeGetter 函数的末尾,我不知道该函数是字符串还是 int 或其他类型,并且在我完成所有反射之前无法知道,所以如何创建此方法,使其具有通用性并正确返回表达式。
【问题讨论】:
-
有什么理由不想使用
Expression.Property(input, propertyName)? -
我需要生成类似于 Expression > 的东西
-
但是你的方法被声明为返回
Expression<Func<T, int>>...如果你需要它在输入和输出中都是通用的,你需要有两个类型参数。 -
我明白了,但这就是我遇到的问题。我需要生成那个表达式,但我不知道表达式输出类型是什么,直到反射发生并且我可以看到属性类型?
-
您打算如何使用 MakeGetter?我假设您在按名称调用时不知道属性类型?
Func<T, object>?
标签: c# linq expression