实体框架泛型方法和反射

本文关键字:反射 泛型方法 框架 实体 | 更新日期: 2023-09-27 18:33:32

>我正在尝试一种通用存储库方法,在控制器类中

var result = typeof(ISiteRepository)
      .GetMethod("UpdateLanguage")
      .MakeGenericMethod(objectType)
      .Invoke(this.siteRepository, new object[] { obj });

它在下面给出了一个错误,我喜欢

GenericArguments[0], 'Site.City' , on 'Void UpdateLanguageT' 违反了类型 'T' 的约束。

域类

public abstract class Entity : IEntity
 {
  [Key]
  public virtual int Id { get; set; }
 }
 public class Language:Entity
 {
  public string Name { get; set; }
  public int LanguageId { get; set; }
 }
 public abstract class Language<T> : Language where T : Language
 {
  public ICollection<T> Languages { get; set; }
 }
 public class City : Language<CityLanguage>
 {
  public int CountryId { get; set; }
  public string Code { get; set; }
  public virtual Country Country { get; set; }
 }
 public class CityLanguage : Language
 {
  public string Description { get; set; }
 }

存储库类


 public interface ISiteRepository
 {
  void UpdateLanguage<T>(T entity) where T : Language<T>;
 }
 public class SiteRepository : ISiteRepository
 {
  public SiteRepository(DbContext context)
   : base(context)
  {
  }
 public void UpdateLanguage<T>(T entity) where T : Language<T>
  {
      var item = GetByKey<T>(entity.Id);
      var languages = entity.Languages;
   }

 }

控制器


 public partial class SiteSettingsController : BaseController
 {
ISiteRepository siteRepository;
public SiteSettingsController(ISiteRepository siteRepository)
{
 this.siteRepository = siteRepository;
}
[HttpPost]
public virtual ActionResult LanguageObjectUpdate(LanguageListModel model,string type)
{
  //type like City
 Type objectType = Type.GetType(type);
 var obj = Activator.CreateInstance(objectType);
 obj.GetType().GetProperty("Id").SetValue(obj, model.Id, null);
 Type languageObjectType = objectType.GetProperty("Languages").DeclaringType.GetGenericArguments()[0];
 object objectLanguages = GetGenericListInstance(languageObjectType);
 foreach (var language in model.Languages)
 {
  object languageObject = Activator.CreateInstance(languageObjectType);
  languageObject.GetType().GetProperty("LanguageId").SetValue(languageObject, language.LanguageId, null);
  foreach (var languageItem in language.Items)
  {
   languageObject.GetType().GetProperty(languageItem.Label).SetValue(languageObject, languageItem.Value, null);
  }

  ((IList)objectLanguages).Add(languageObject);
 }
 obj.GetType().GetProperty("Languages").SetValue(obj, objectLanguages, null);
 var result = typeof(ISiteRepository)
  .GetMethod("UpdateLanguage")
  .MakeGenericMethod(objectType)
  .Invoke(this.siteRepository, new object[] { obj });
 return PartialView("Result";
}
private static object GetGenericListInstance(Type languageObjectType)
{
 Type listType = typeof(List<>);
 Type[] listTypeGenericArguments = { languageObjectType };
 Type objectLanguagesType = listType.MakeGenericType(listTypeGenericArguments);
 object objectLanguages = Activator.CreateInstance(objectLanguagesType);
 return objectLanguages;
}

实体框架泛型方法和反射

您的泛型方法UpdateLanguage<T>(T entity)要求TLanguage<T>。但是由于Language<>是一个类,这似乎有点难以获得。您收到的错误表明未满足约束。