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



我真的想不通这个...

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

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

让我介绍一下变量... _builder 的类型为 DbModelBuilderPost 具有 Guid 类型的属性Id

在下面的代码中,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 时(:

对象与目标类型不匹配。

我已经尝试了我能想到的所有想法,但我仍然无法匹配目标类型。

任何帮助,不胜感激。

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

愚蠢的

我,我没有借口...

操作方法实体框架和反射:

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 });

相关内容

  • 没有找到相关文章

最新更新