通过反射访问泛型类中的泛型实例的私有成员

时间:2018-06-16 20:07:12

标签: c# generics reflection entity-framework-6 extension-methods

我查看了可能存在重复的问题,其中任何一个问题都没有得到解答,包括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。

扩展方法与我期望它运行的类位于相同的命名空间和程序集中。

0 个答案:

没有答案