繁体   English   中英

使用反射 C# 创建 List 的实例

[英]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.

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