gpt4 book ai didi

c# - 反射:具有泛型参数和 lambda 表达式作为参数的方法

转载 作者:太空狗 更新时间:2023-10-29 23:41:14 24 4
gpt4 key购买 nike

我真的想不通这个...

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

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

让我介绍变量... _builderDbModelBuilder 类型,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 时):

Object does not match target type.

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

感谢任何帮助。

最佳答案

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

关于c# - 反射:具有泛型参数和 lambda 表达式作为参数的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7816141/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com