我真的想不通这个...
我正在尝试使用反射实现以下结果:
_builder.Entity<Post>().HasKey(p => p.Id);
让我介绍一下变量... _builder
的类型为 DbModelBuilder
,Post
具有 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 });