c# - 如何使用反射将 System.Type 传递给泛型方法

标签 c# entity-framework generics reflection

<分区>

Possible Duplicate:
How to use reflection to call generic Method?

我正在尝试简化一些 EF Code First 配置。

而不是像这样编写代码:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Asset>().ToTable("Assets");
    modelBuilder.Entity<VideoAsset>().ToTable("VideoAssets");
    modelBuilder.Entity<ImageAsset>().ToTable("ImageAssets");
    ...
}

我将每个类型声明的表包装到一个类中并使用反射来调用 modelBuilder

public class TablePerTypeBuilder<TBase> where TBase : class
{
    public void Build(DbModelBuilder modelBuilder)
    {
        //modelBuilder.Entity<Asset>().ToTable("Assets");
        modelBuilder.Entity<TBase>().ToTable(typeof(TBase).Name);

        //modelBuilder.Entity<VideoAsset>().ToTable("VideoAssets");
        //modelBuilder.Entity<ImageAsset>().ToTable("ImageAssets");
        var types = from a in AppDomain.CurrentDomain.GetAssemblies()
                    from t in a.GetTypes()
                    where typeof(TBase).IsAssignableFrom(t)
                    select t;

        foreach (Type type in types)
        {           
            modelBuilder.Entity<type>().ToTable(type.Name); 
            //Error - The type or namespace name 'type' could not be found (are you missing a using directive or an assembly reference?)
        }
    }
}

由于编译时安全性,不可能将类型添加为泛型参数。那么是否可以使用反射进行相同的调用?

目的是像这样调用builder

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    TablePerTypeBuilder<Asset> builder = new TablePerTypeBuilder<Asset>();
    builder.Build(modelBuilder);
}

最佳答案

按照建议,您可以使用 MakeGenericMethod()。但它有很多像这样丑陋的打字:

var method = modelBuilder.GetType().GetMethod("Entity");
var genericMethod = method.MakeGenericMethod(type);
var entTypConfig = genericMethod.Invoke(modelBuilder, null);
entTypConfig.GetType()
    .InvokeMember("ToTable", BindingFlags.InvokeMethod, null, entTypConfig, 
                  new object[] {type.Name});

关于c# - 如何使用反射将 System.Type 传递给泛型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7488438/

相关文章:

c# - 如何获取 ObjectSet<T> 的实体键名?

asp.net-mvc - context.SaveChanges 不起作用

java - 如何将泛型类型绑定(bind)到在层次结构中几乎完全分离的 2 种类型

c# - 为什么类类型参数的方差必须与其方法的返回/参数类型参数的方差匹配?

c# - 如何将鼠标移动位置值存储在数组中?

javascript - 如何解绑特定页面的脚本

c# - 哈希整数数组

C# Json.NET WCF Rest 日期时间格式

c# - 无需手动比较即可添加或删除多条记录

java - 填充用 <?> 类型声明的数组