C# 反射 操作列表类型属性

C# 反射 操作列表类型属性

  • 本文介绍对列表进行创建及赋值的反射操作
  • 我们现在有 TestA、TestB 类, TestA 中有 TestB 类型列表的属性 List ,如下:
public class TestA
        public List<TestB> List { get; set; }
    public class TestB
        public TestB(string name)
            Name = name;
        public string Name { get; }
    }


大家能看到这里,感谢

分享一组7月录制的C#零基础教程。 我们喜欢做这样的分享,它足够的基础,对新手友好。如果需要的话,就来免费领取吧!

快来领取吧

资料免费自取:

由于内容过多不便呈现, 需要视频教程和配套源码的小伙伴, 可点击这里,添加我知乎主页个人说明处号码 免费分享

也可直接点击下方卡片: 点击后可自动复制威芯号,并跳转到威芯。得辛苦大家自行搜索威芯号添加。内容已做打包,添加后直接发送注意查收!

  • 下面通过反射,给 TestA.List 进行赋值, output 的期望是 “1,2” ;
var testA = new TestA();
var list = new List<TestB>() { new TestB("1"), new TestB("2") };
AddValueToListProperty(testA, nameof(TestA.List), list);
var output = string.Join(",", testA.List.Select(i => i.Name));

1)确定 列表及泛型时 ,可以直接设置属性值;

private void AddValueToListProperty(object objectValue, string propertyName, List<TestB> list)
  var propertyInfo = objectValue.GetType().GetProperty(propertyName);
  propertyInfo.SetValue(objectValue, list, null);
}

2)确定属性是列表,但不确定列表的泛型时,通过列表的Add方式进行设置值;

List<object> list 上方的 方案1 ,是无法进行赋值的,因为类型不一样。会提示隐示转换异常。

private void AddValueToListProperty(object objectValue, string propertyName, List<object> list)
        var propertyInfo = objectValue.GetType().GetProperty(propertyName);
        var newList = Activator.CreateInstance(typeof(List<>).MakeGenericType(propertyInfo.PropertyType.GenericTypeArguments));
        propertyInfo.SetValue(objectValue, newList, null);
        var addMethod = newList.GetType().GetMethod("Add");
        foreach (var item in list)
            addMethod.Invoke(newList, new object[] { item });
}

如上,我们需要先创建一个空列表,对属性进行初始化。 propertyInfo.PropertyType.GenericTypeArguments 是列表的泛型类型;

然后,获取列表的新增方法 newList.GetType().GetMethod("Add") ,将 List<object> list 一项项添加到列表中。

3)不确定属性是否列表,也不确定列表的泛型,可以如下处理;

private void AddValueToListProperty(object objectValue, string propertyName, object list)
        var propertyInfo = objectValue.GetType().GetProperty(propertyName);
        if (typeof(System.Collections.IList).IsAssignableFrom(propertyInfo.PropertyType))
            var newList = Activator.CreateInstance(typeof(List<>).MakeGenericType(propertyInfo.PropertyType.GenericTypeArguments));
            propertyInfo.SetValue(objectValue, newList, null);
            var addMethod = newList.GetType().GetMethod("Add");
            foreach (var item in (IEnumerable)list)
                addMethod.Invoke(newList, new object[] { item });