我查看了可能存在重复的问题,其中任何一个问题都没有得到解答,包括Accessing Properties Through Generic Type Parameters
TLDR;当typeof(T).GetProperty(propertyName, BindingFlags.NonPublic)
的T未被声明为公共时,propertyName
在泛型类中不起作用,即使设置了NonPublic BindingFlag也是如此。有解决方法吗?
我已经实现了一个扩展方法,该方法从提供的字符串生成IOrderedQueryable,该字符串包含在Entity Framework环境中进行排序的所需列。目标是允许Order By子句以字符串形式写入,例如" + Age,+ State,-Name"并生成必要的表达式,按年龄,状态和名称(降序)对实体框架结果进行排序,而不必编写:
.OrderBy(m=>m.Age).ThenBy(m=>m.State).ThenByDescending(m=>m.Name)
。
当我尝试访问标记为internal的类属性时,会出现问题。我似乎无法找到任何方法来强制反思来找到内部属性。
在这种特殊情况下,我在数据库中有一个日期时间字段,它存储了UTC但我希望最终用户在本地时间使用它,因此值startTime,一个内部范围的属性绑定到数据库并且StartTime服务作为公共访问器,提供对startTime值的访问,执行必要的映射到本地时间。我的课程定义如下:
public class TimeInterval {
//other properties...
internal startTime { get; set; } // bound to database, stores time in UTC
public StartTime {
get { /*convert startTime to local time*/; }
set { /*convert value back to UTC and store in startTime*/; }
}
}
使用EF,我可以写.OrderBy( m=>m.startTime )
并按预期工作;当然我不能使用.OrderBy( m=>m.StartTime )
,因为它是派生的。
在我的扩展功能中,其签名为
static public IOrderedQueryable<T> ParseOrderBy<T>(
this IQueryable<T> query,
string orderBy
)
我打电话使用:
var query = query.ParseOrderBy<TimeInterval>( "startTime" );
我获取构建lamba表达式的属性引用的调用返回null。
var property = typeof( T ).GetProperty( "startTime", BindingFlags.NonPublic );
对于任何未明确公开的内容, property
都会返回null。
扩展方法与我期望它运行的类位于相同的命名空间和程序集中。