C# 如何运行GetMethod.Invoke?我出错了
System.Reflection.TargetException:对象与目标类型不匹配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
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创建了一个实例。非常感谢你的想法。