【问题标题】:Entity Framework Generic Method and Reflection实体框架通用方法和反射
【发布时间】:2012-05-08 16:30:10
【问题描述】:

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

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

【问题讨论】:

    标签: c# .net asp.net-mvc entity-framework reflection


    【解决方案1】:

    您的通用方法UpdateLanguage&lt;T&gt;(T entity) 要求TLanguage&lt;T&gt;。但是由于Language&lt;&gt; 是一个类,这似乎有点难以获得。您得到的错误表明不满足约束。

    【讨论】:

    • CityLanguage&lt;CityLanguage&gt;,而不是泛型方法所要求的 Language&lt;City&gt;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    • 1970-01-01
    相关资源
    最近更新 更多