如何从类构造函数动态初始化项?

时间:2015-12-30 15:32:51

标签: c# class types constructor

在我的类构造函数中,我正在初始化许多List [DropDownItem]列表.....我不想再在构造函数中列出所有这些列表,我希望它们能够自动地进行初始化。

我有以下内容,可以识别我需要定位的类型,但我无法通过目标线获得它。无法弄清楚如何做“obj = new List(); part。

private void initializeDropdownItemLists(Type T)
{
    var props = typeof(UserEditModel).GetProperties();

    foreach (var p in props)
    {
        var type = p.PropertyType;
        if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(List<>))
        {
            var itemType = type.GetGenericArguments()[0];

            if (itemType == typeof(DropdownItem))
            {
                p.SetValue(T, new List<DropdownItem>());
            }
        }

    }
}


public class UserEditModel
{
    public UserEditModel()
    {
        selectedUser = new UserBusinessModel();
        currentUser = new UserBusinessModel();

        //  I want to replace this
        ddl1 = new List<DropdownItem>();
        ddl2 = new List<DropdownItem>();
        ddl3 = new List<DropdownItem>();
        ddl4 = new List<DropdownItem>();
        ddl5 = new List<DropdownItem>();
        ddl6 = new List<DropdownItem>();
        ddl7 = new List<DropdownItem>();
        ddl8 = new List<DropdownItem>();
        ddl9 = new List<DropdownItem>();
        ddl10 = new List<DropdownItem>();

        //  with this
        this.initializeDropdownItemLists();

        //  or better yet this, ..... pass the class type so then any similar class can use it
        someHelper.initializeDropdownItemLists(typeof(UserEditModel));
    }

    public UserBusinessModel currentUser { get; set; }
    public UserBusinessModel selectedUser { get; set; }

    //  other properties omitted for brevity ...
}

1 个答案:

答案 0 :(得分:1)

使用以下代码:

p.SetValue(someUserEditModelObject, new List<DropdownItem>());

其中someUserEditModelObject是传递给initializeDropdownItemLists方法的对象。

编辑: 通用助手代码:

    public class Helper
    {
        public void InitializeDropdownItemLists<T>(T model)
        {
            var props = typeof (T).GetProperties();

            foreach (var p in props)
            {
                var type = p.PropertyType;
                if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof (List<>))
                {
                    var itemType = type.GetGenericArguments()[0];

                    if (itemType == typeof (DropdownItem))
                    {
                        p.SetValue(model, new List<DropdownItem>());
                    }
                }

            }
        }
    }