如何使用反射将对象添加到 class 实例的通用列表 属性
How to add an object to a generic list property of an instance of a class using reflection
我下面有一个class结构。我收到此错误。我在这里遗漏了什么吗?
Object does not match target type.
Class结构
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 });
应该是这样的:
// 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 });
更新。这是 fiddle link.
问题是您获得了 List<Lecture>
的 Add
方法,并尝试使用 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>
本身(它只代表 属性 本身及其 get
和 set
方法,并以您的 object[]
作为参数调用它的 Add
方法。
还有一件事。为什么使用:
Type ti = Type.GetType(pi.PropertyType.AssemblyQualifiedName);
何时可以使用:
Type ti = pi.PropertyType;
我下面有一个class结构。我收到此错误。我在这里遗漏了什么吗?
Object does not match target type.
Class结构
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 });
应该是这样的:
// 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 });
更新。这是 fiddle link.
问题是您获得了 List<Lecture>
的 Add
方法,并尝试使用 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>
本身(它只代表 属性 本身及其 get
和 set
方法,并以您的 object[]
作为参数调用它的 Add
方法。
还有一件事。为什么使用:
Type ti = Type.GetType(pi.PropertyType.AssemblyQualifiedName);
何时可以使用:
Type ti = pi.PropertyType;