我真的无法想出这一个......
我正在尝试使用反射来实现以下结果:
_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时):
对象与目标类型不匹配。
我已经尝试了所有可以提出的想法,但仍然无法匹配目标类型。
感谢任何帮助。
答案 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 });