反射:使用泛型参数和lambda表达式作为参数的方法

时间:2011-10-19 03:09:24

标签: c# entity-framework generics reflection lambda

我真的无法想出这一个......

我正在尝试使用反射来实现以下结果:

_builder.Entity<Post>().HasKey(p => p.Id);

让我介绍一下变量...... _builder的类型为DbModelBuilder,而Post的属性Id的类型为Guid

在下面的代码中,contentType包含System.Type

var config = _builder.GetType()
    .GetMethod("Entity")
    .MakeGenericMethod(contentType.Type)
    .Invoke(_builder, null);

var hasKey = config.GetType().GetMethod("HasKey");

var expressionKey = typeof(Expression<>)
    .MakeGenericType(typeof(Func<,>)
    .MakeGenericType(contentType.Type, typeof(Guid)));

var paramEx = Expression.Parameter(contentType.Type, "t");
var lambdaEx = Expression.Lambda(Expression.Property(paramEx, "Id"), paramEx);

hasKey.MakeGenericMethod(typeof(Guid))
    .Invoke(_builder, new[] { lambdaEx });

HasKey定义可能有所帮助:

public EntityTypeConfiguration<TEntityType> HasKey<TKey>(Expression<Func<TEntityType, TKey>> keyExpression);

...其中TEntityType应为Post类型,TKey类型为Guid ...

抛出类型TargetException的异常(在上次调用Invoke时):

  

对象与目标类型不匹配。

我已经尝试了所有可以提出的想法,但仍然无法匹配目标类型。

感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

在上次调用Invoke时,您指定了错误的实例参数。应该是'config'而不是'_builder'

答案 1 :(得分:0)

傻了我,我没有任何借口......

操作方法实体框架&amp;反射

var config = _builder.GetType()
    .GetMethod("Entity")
    .MakeGenericMethod(contentType.Type)
    .Invoke(_builder, null);

var hasKey = config.GetType().GetMethod("HasKey");

var expressionKey = typeof(Expression<>)
    .MakeGenericType(typeof(Func<,>)
    .MakeGenericType(contentType.Type, typeof(Guid)));

var paramEx = Expression.Parameter(contentType.Type, "t");
var lambdaEx = Expression.Lambda(Expression.Property(paramEx, "Id"), paramEx);

hasKey.MakeGenericMethod(typeof(Guid))
    .Invoke(config, new[] { lambdaEx });