[英]Create instance of List using reflection c#
我致力于在我们的实体中动态创建集合实例的方法。 我的问题是,当我创建必须插入数据库的新记录时,我的ICollection
导航属性始终为空,并且在我的安全方法中
我必须使用下面这样的东西来创建新List
,这绝对不是一个好方法。 如果我不创建List
实例, Mapper
将抛出错误,指出它无法将Collection
of something 映射到null
,例如它无法将 List of Categories
映射到 null。
我的安全方法示例
//check if record exists in database so i know if have to update or insert record (based on entity Id)
var entity = repository.GetById(detail.Id)
//....some code removed for brevity
if (entity.Categories == null)
{
entity.Categories = new List<Category>();
}
if (entity.UserContacts == null)
{
entity.UserContacts = new List<UserContact>();
}
//dto => entity
Mapper.PopulateEntity(dto, entity);
//update or insert later on.
必须创建List<T>
实例的扩展方法,例如new List<Category>()
如上所示。
public TEntity InitializeEntity(TEntity entity)
{
var properties = entity.GetType().GetProperties();
foreach (var prop in properties)
{
if (typeof(ICollection<TEntity>).Name == (prop.PropertyType.Name))
{
var get = prop.GetGetMethod();
//get assembly with entity namespace and class name
var fullName = get.GetBaseDefinition().ReturnType.GenericTypeArguments[0].AssemblyQualifiedName;
//create instance of object
var myObj = Activator.CreateInstance(Type.GetType(fullName));
//check if property is null or if get some value, dont want to rewrite values from database
var value = prop.GetValue(entity);
if (value == null)
{
var listType = typeof(List<>);
var constructedListType = listType.MakeGenericType(myObj.GetType());
Activator.CreateInstance(constructedListType);
}
}
}
return entity;
}
出于某种原因,它根本没有创建任何实例,我无法弄清楚问题出在哪里。
您忘记通过prop.SetValue
为属性设置值。 这是修复了该问题的代码的清理版本:
public static TEntity InitializeEntity<TEntity>(TEntity entity)
{
var properties = entity.GetType().GetProperties();
foreach (var prop in properties)
{
if (prop.PropertyType.IsGenericType && prop.PropertyType.GetGenericTypeDefinition() == typeof(ICollection<>))
{
//check if property is null or if get some value, dont want to rewrite values from database
var value = prop.GetValue(entity);
if (value == null) {
var itemType = prop.PropertyType.GetGenericArguments()[0];
var listType = typeof(List<>);
var constructedListType = listType.MakeGenericType(itemType);
prop.SetValue(entity, Activator.CreateInstance(constructedListType));
}
}
}
return entity;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.