Я использую codeDOM для создания классов сущностей во время выполнения. У меня также есть общий репозиторий для работы с различными функциями БД. Вот метод Insert в качестве примера метода в моем универсальном репозитории:
public void Insert<TEntity>(TEntity entity) where TEntity : class, IBusinessEntity
{
if (entity == null)
{
throw new ArgumentNullException("entity");
}
TEntity existing = Existing(entity);
if (existing == null)
{
_context.Set<TEntity>().Add(entity);
this._context.SaveChanges();
}
}
Вот пример кода того, как я генерирую класс сущности и как создать сущность на основе этого класса сущности с помощью codeDOM:
//Generate the fields of the new entity class
EntityGenerator.EntityFieldInfo entityField1 = new EntityGenerator.EntityFieldInfo("Name", typeof(string), RelationshipType.NoRelation);
EntityGenerator.EntityFieldInfo entityField2 = new EntityGenerator.EntityFieldInfo("Shape", typeof(string), RelationshipType.NoRelation);
ICollection<EntityGenerator.EntityFieldInfo> entityFieldList = new List<EntityGenerator.EntityFieldInfo> { entityField1, entityField2 };
// Create the new entity class using the fields established above
// as well as the name of the entity (typeName = "Thing")
string typeName = "Thing";
EntityGenerator.CreateEntityClass(entityFieldList, typeName);
CompilerResults results = EntityGenerator.GetCompiledEntity(typeName);
// Create an entity instance based on the new entity class that was just created
Object newThing = EntityGenerator.CreateInstanceOfEntity(results, typeName);
SetObjectField(newEntity, "Name", "Box");
SetObjectField(newEntity, "Shape", "Cuboid");
Как видите, newThing (экземпляр новой сущности) является типом Object. Если бы это был жестко закодированный класс сущностей, я мог бы просто сказать
Thing newThing;
Но объект Thing, созданный CodeDOM, не является жестко запрограммированным классом, поэтому мне приходится использовать тип Object вместо типа Thing. Это проблема, потому что я использую общий репозиторий. Допустим, я хочу вставить этот объект в базу данных. Я хотел бы позвонить:
myRepository.Insert<Thing>(newThing);
Однако Thing только что был создан CodeDOM во время выполнения, поэтому он не является классом, что означает, что он не может находиться внутри ‹>. Возможно, вы заметили выше в моем методе Insert, что TEntity также является IBusinessEntity. Если я попытаюсь
myRepository.Insert<IBusinessEntity>(newThing);
Я получаю сообщение об ошибке:
Тип аргумента «объект» не может быть назначен типу параметра «Models.IBusinessEntity».
Если я попробую без чего-либо внутри ‹>, вот так:
мойРепозиторий.Вставить(новаяВещь);
Я получаю сообщение об ошибке:
Тип «объект» должен быть преобразован в «Models.IBusinessEntity», чтобы использовать его в качестве параметра «TEntity» в универсальном методе «void Insert (TEntity)».
Кто-нибудь знает, как я могу согласовать этот объект, созданный codeDOM, с общим репозиторием? Поможет ли рефлексия? Было бы неплохо, если бы рефлексия каким-то образом могла дать мне класс Thing, который можно было бы передать в ‹>. Также я должен отметить, что все объекты, которые я создаю с помощью CodeDOM, расширяют IBusinessEntity.