方法调用通过反射检索的变量类型

时间:2015-01-09 14:15:27

标签: c# 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);
}

但是,我仍然需要在.Map() .Ignore()上拨打modelEntityEntityTypeConfiguration<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上调用它们?

1 个答案:

答案 0 :(得分:2)

解决此问题的一种方法是创建自己的通用方法,将三个调用合并为一个,并使用反射来调用您的方法,如下所示:

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