0

コントローラクラスで、ある種のジェネリックリポジトリメソッドを試しています

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

それは私に以下のようなエラーを与えました

'Void UpdateLanguageT'のGenericArguments[0]、'Site.City'、、は、タイプ'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;
}
4

1 に答える 1

2

ジェネリックメソッドはであるUpdateLanguage<T>(T entity)必要TがありLanguage<T>ます。しかし、Language<>はクラスなので、それを取得するのは少し難しいようです。表示されるエラーは、制約が満たされていないことを示しています。

于 2012-05-08T08:30:10.520 に答える