如何使用反射将对象添加到类的实例的通用列表属性

时间:2016-08-26 08:32:43

标签: c# .net reflection generic-list mscorlib

我下面有一个班级结构。我收到了这个错误。我在这里错过了什么吗?

  

对象与目标类型不匹配。

班级结构

public class Schedule
{
    public Schedule() { Name = ""; StartDate = DateTime.MinValue; LectureList = new List<Lecture>(); }
    public string Name { get; set; }
    public DateTime StartDate { get; set; }
    public List<Lecture> LectureList { get; set; }
}

public class Lecture
{
    public string Name { get; set; }
    public int Credit { get; set; }
}

我在尝试什么:

Schedule s = new Schedule();
Type t = Type.GetType("Lecture");
object obj = Activator.CreateInstance(t);
obj.GetType().GetProperty("Name").SetValue(obj, "Math");
obj.GetType().GetProperty("Credit").SetValue(obj, 1);
PropertyInfo pi = s.GetType().GetProperty("LectureList");
Type ti = Type.GetType(pi.PropertyType.AssemblyQualifiedName);
ti.GetMethod("Add").Invoke(pi, new object[] { obj });

2 个答案:

答案 0 :(得分:2)

它应该是这样的:

// gets metadata of List<Lecture>.Add method
var addMethod = pi.PropertyType.GetMethod("Add");

// retrieves current LectureList value to call Add method
var lectureList = pi.GetValue(s);

// calls s.LectureList.Add(obj);
addMethod.Invoke(lectureList, new object[] { obj });

UPD。这是小提琴link

答案 1 :(得分:2)

问题是你获得了Add List<Lecture>方法并尝试用PropertyInfo作为调用该方法的实例来调用它。

变化:

ti.GetMethod("Add").Invoke(pi, new object[] { obj });

为:

object list = pi.GetValue(s);
ti.GetMethod("Add").Invoke(list, new object[] { obj });

这样pi.GetValue(s)PropertyInfo获取List<Lecture>本身(仅代表属性本身及其getset方法,并调用其Add方法以object[]作为参数。

还有一件事。为什么使用:

Type ti = Type.GetType(pi.PropertyType.AssemblyQualifiedName);

何时可以使用:

Type ti = pi.PropertyType;