C# 如何运行GetMethod.Invoke?我出错了

C# 如何运行GetMethod.Invoke?我出错了,c#,asp.net-mvc,reflection,asp.net-core,asp.net-core-mvc,C#,Asp.net Mvc,Reflection,Asp.net Core,Asp.net Core Mvc,System.Reflection.TargetException:对象与目标类型不匹配 public class Parameter : BaseEntity { ... ... public override void Map(ModelBuilder modelBuilder) { modelBuilder.Entity<Parameter>(opt => { opt.ToTable

System.Reflection.TargetException:对象与目标类型不匹配

public class Parameter : BaseEntity
{
    ...
    ...

    public override void Map(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Parameter>(opt =>
        {
            opt.ToTable("Parameter");
            opt.HasKey(x => x.Id);
            opt.Property(x => x.AutoId).UseSqlServerIdentityColumn();
            opt.HasAlternateKey(x => x.AutoId);
        });
    }
}


public class DataContext<T> : DbContext where T : BaseEntity
{
    ...
    ...

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        Type t = typeof(T);
        t.GetMethod("Map").Invoke(this, new object[] { modelBuilder }); // this line *****
    }
}
T被称为参数类。//这一行******边给了我一个错误

System.Reflection.TargetException:对象与目标类型不匹配

public class Parameter : BaseEntity
{
    ...
    ...

    public override void Map(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Parameter>(opt =>
        {
            opt.ToTable("Parameter");
            opt.HasKey(x => x.Id);
            opt.Property(x => x.AutoId).UseSqlServerIdentityColumn();
            opt.HasAlternateKey(x => x.AutoId);
        });
    }
}


public class DataContext<T> : DbContext where T : BaseEntity
{
    ...
    ...

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        Type t = typeof(T);
        t.GetMethod("Map").Invoke(this, new object[] { modelBuilder }); // this line *****
    }
}
如何运行此操作?

如果您创建了一个类似于以下内容的参数,甚至参数类型都是不相关的,那么您的问题将立即变得明显:

class ArgumentType
{

}

class Foo
{
    public void Bar(ArgumentType argument)
    {
    }
}

class Program
{
    static void Main(string[] args)
    {
        Type t = typeof(Foo);

        var argument = new ArgumentType();

        t.GetMethod("Bar").Invoke(this, new object[] { argument });
    }
}
您正在对此调用方法,在您的案例中,它不是一个Foo或T,因此您得到了该异常

要修复代码,您需要实例化T并在其上调用方法:

var instance = new Foo(); // or new T() in your case

t.GetMethod("Bar").Invoke(instance, new object[] { argument });

您还必须将T约束为new,以使其工作,以指示为T传递的类型参数必须具有无参数构造函数,以便您可以在那里实例化它。

好的,您使用此函数调用它,而这不是参数,而是数据上下文,这就是它不工作的原因。你有一个你想要使用的参数的实例吗?实际上我试着用t来代替这个。我也犯了同样的错误。我想在那里写,因为它必须是通用的。我有一个更像x20类的参数,它们有Map void。我必须打电话给他们来运行这个项目。根据你的代码t是t的类型,而不是t的实例。我得到了这个!我使用Activator创建了一个实例。非常感谢你的想法。