如何运行GetMethod.Invoke?我收到了错误

时间:2017-08-26 09:56:30

标签: c# asp.net-mvc reflection asp.net-core asp.net-core-mvc

System.Reflection.TargetException:Object与目标类型不匹配。

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:Object与目标类型不匹配。

我该怎么办?

1 个答案:

答案 0 :(得分:1)

如果您创建Minimal, Complete, and Verifiable example,类似以下内容(甚至参数类型无关紧要),您的问题会立即变得明显:

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

您在this上调用该方法,一个Foo(或您的T),所以你得到了那个例外。

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

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

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

您还必须将T限制为new()才能使其工作,以指示为T传递的类型参数必须具有无参数构造函数,因此您可以在那里实例化它。