我正在尝试在使用EF6时动态切换表注释的架构值@运行时。所以这是到目前为止我得到的:var builder = new DbModelBuilder()var dbSetProperties = typeof(T).GetProperties().Where(p => p.PropertyType.GetGenericTypeDefinition() == typeof(DbSet<>));foreach (PropertyInfo property in dbSetProperties){ Type[] propTypes = property.PropertyType.GetGenericArguments(); // Iterate the DbSets and set the correct schema foreach (Type dbSetType in propTypes) { // Get the TableAttribute var tableAttribute = Attribute.GetCustomAttribute(dbSetType, typeof(TableAttribute)); MethodInfo dbModelMethodInfo = typeof(DbModelBuilder).GetMethod("Entity"); MethodInfo entityTypeConfigMethodInfo = typeof(EntityTypeConfiguration<>).GetMethod("ToTable", new[] { typeof(String), typeof(String) }); MethodInfo genericDbModelMethodInfo = dbModelMethodInfo.MakeGenericMethod(dbSetType); genericDbModelMethodInfo.Invoke(builder, null); entityTypeConfigMethodInfo.Invoke(genericDbModelMethodInfo, new Object[] { (tableAttribute as TableAttribute).Name, "NEW_SCHEMA_VALUE" }); }}我要完成的工作是这样的(不起作用):builder.Entity<dbSetType>().ToTable((tableAttribute as TableAttribute).Name, "NEW_SCHEMA_VALUE");基本上,对于T,我想拉DbSet,确定Entity 泛型中使用的Class,获取TableAttribute,然后将Schema设置为新值。当前,在entityTypeConfigMethodInfo.Invoke上,出现错误“无法对包含ContainsGenericParameters为true的类型或方法执行后期绑定操作”的错误。我想念什么? (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 为了获得正确的第二次调用的封闭通用方法信息,您将代码重写为:MethodInfo genericDbModelMethodInfo = dbModelMethodInfo.MakeGenericMethod(dbSetType);MethodInfo entityTypeConfigMethodInfo = genericDbModelMethodInfo.ReturnType.GetMethod("ToTable", new[] { typeof(String), typeof(String) });然后,您必须将genericDbModelMethodInfo.Invoke调用的返回值用作第二个调用中的第一个参数。var obj = genericDbModelMethodInfo.Invoke(builder, null);entityTypeConfigMethodInfo.Invoke(obj, new Object[] { (tableAttribute as TableAttribute).Name, "NEW_SCHEMA_VALUE" });这是因为MethodInfo.Invoke中的第一个参数是您要在其上调用方法的对象。 (adsbygoogle = window.adsbygoogle || []).push({});
07-27 16:25