简体   繁体   English

实体框架通用方法与反思

[英]Entity Framework Generic Method and Reflection

i am trying a kind of generic repository method,in controller class 我正在尝试一种通用的存储库方法,在控制器类中

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

it given an error me below like 它在下面给出了一个错误

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

Domain classes 域类

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

Repository class 存储库类


 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;

   }


 }

Controller 调节器


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

Your generic method UpdateLanguage<T>(T entity) requires T to be a Language<T> . 您的通用方法UpdateLanguage<T>(T entity)要求TLanguage<T> But since Language<> is a class, that seems a little hard to obtain. 但由于Language<>是一个类,这似乎有点难以获得。 The error you get tells that the constraint is not met. 您得到的错误告诉您不满足约束。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM