我需要将表示接口上的属性名称的字符串转换为表达式。我已经完成了大部分工作,最后只有一件我无法弄清楚。
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 或其他类型,并且在我完成所有反射之前无法知道,所以我怎么能创建此方法,使其具有通用性并正确返回一个表达式。