对通过反射检索到的变量类型的方法调用
Method calls on variable type retrieved through reflection
作为为早期 problem 创建解决方法的工作的一部分,我有一个 Type
列表,我(在一个完美的世界中)想要在其上执行以下代码:
foreach (Type entityType in entityTypes)
{
modelBuilder.Entity<entityType>()
.Map(m => m.Requires("Deleted").HasValue(false))
.Ignore(m => m.Deleted);
}
很明显,因为我们不能这样使用变量类型,所以我不得不使用反射。到目前为止,我最多可以调用第一种方法 .Entity()
:
foreach (Type entityType in entityTypes)
{
var modelEntity = typeof (DbModelBuilder)
.GetMethod("Entity")
.MakeGenericMethod(new[] {entityType})
.Invoke(modelBuilder, null);
}
但是,我仍然需要在 modelEntity
上调用 .Map()
和 .Ignore()
,类型为 EntityTypeConfiguration<T>
。这就是我的问题所在,因为我知道(在运行时)T
是 entityType
类型,但我不能简单地调用以下代码:
foreach (Type entityType in entityTypes)
{
var modelEntity = typeof (DbModelBuilder)
.GetMethod("Entity")
.MakeGenericMethod(new[] {entityType})
.Invoke(modelBuilder, null);
var mappedEntity = typeof (EntityTypeConfiguration<entityType>)
.GetMethod("Map")
.MakeGenericMethod(new[] {entityType})
.Invoke(modelEntity, <parameters>);
}
因为我又遇到了同样的问题,为什么我首先使用反射调用 .Entity()
。我可以再次使用反射来调用这两种方法,还是可以使用其他方式直接在 modelEntity
?
上调用它们
解决此问题的一种方法是制作一个您自己的通用方法,将三个调用合并为一个,然后使用反射来调用您的方法,如下所示:
void LoopBody<T>() { // Give the method a better name
modelBuilder.Entity<T>()
.Map(m => m.Requires("Deleted").HasValue(false))
.Ignore(m => m.Deleted);
}
现在您可以从循环中调用此方法:
foreach (Type entityType in entityTypes) {
GetType().GetMethod("LoopBody")
.MakeGenericMethod(new[] { entityType })
.Invoke(this, null);
}
作为为早期 problem 创建解决方法的工作的一部分,我有一个 Type
列表,我(在一个完美的世界中)想要在其上执行以下代码:
foreach (Type entityType in entityTypes)
{
modelBuilder.Entity<entityType>()
.Map(m => m.Requires("Deleted").HasValue(false))
.Ignore(m => m.Deleted);
}
很明显,因为我们不能这样使用变量类型,所以我不得不使用反射。到目前为止,我最多可以调用第一种方法 .Entity()
:
foreach (Type entityType in entityTypes)
{
var modelEntity = typeof (DbModelBuilder)
.GetMethod("Entity")
.MakeGenericMethod(new[] {entityType})
.Invoke(modelBuilder, null);
}
但是,我仍然需要在 modelEntity
上调用 .Map()
和 .Ignore()
,类型为 EntityTypeConfiguration<T>
。这就是我的问题所在,因为我知道(在运行时)T
是 entityType
类型,但我不能简单地调用以下代码:
foreach (Type entityType in entityTypes)
{
var modelEntity = typeof (DbModelBuilder)
.GetMethod("Entity")
.MakeGenericMethod(new[] {entityType})
.Invoke(modelBuilder, null);
var mappedEntity = typeof (EntityTypeConfiguration<entityType>)
.GetMethod("Map")
.MakeGenericMethod(new[] {entityType})
.Invoke(modelEntity, <parameters>);
}
因为我又遇到了同样的问题,为什么我首先使用反射调用 .Entity()
。我可以再次使用反射来调用这两种方法,还是可以使用其他方式直接在 modelEntity
?
解决此问题的一种方法是制作一个您自己的通用方法,将三个调用合并为一个,然后使用反射来调用您的方法,如下所示:
void LoopBody<T>() { // Give the method a better name
modelBuilder.Entity<T>()
.Map(m => m.Requires("Deleted").HasValue(false))
.Ignore(m => m.Deleted);
}
现在您可以从循环中调用此方法:
foreach (Type entityType in entityTypes) {
GetType().GetMethod("LoopBody")
.MakeGenericMethod(new[] { entityType })
.Invoke(this, null);
}