我有一个包含许多其他对象列表的对象。我将提供一个简单的例子。
public class BaseApplicationData
{
public long Id { get; set; }
}
public class Phone : BaseApplicationData
{
public string PhoneType { get; set; }
public string Number { get; set; }
public string Extension { get; set; }
}
public class Employer : BaseApplicationData
{
public double Salary { get; set; }
public string Name { get; set; }
public string EmployementType { get; set; }
}
public class Applicant : BaseApplicationData
{
public string Name { get; set; }
public string EmailAddress { get; set; }
public List<Phone> PhoneNumbers { get; set; }
public List<Employer> Employers { get; set; }
}
在我正在使用的实际代码中,有更多这些列表。在处理过程中,我们需要能够为每个列表执行CRUD操作。每个列表的过程都是相同的。因此,不是为每个列表类型编写一组CRUD方法,而是我可以使用泛型和/或反射来为每个列表完成这些操作。
所以我创建了一个方法,但我的结果并不是我所期待的。使用上面的示例对象,我创建了一个申请者对象并向其添加了一个Employer对象。 (这是为了模拟已包含数据的列表。)然后我调用了我的方法(如下所示)。
public long CreatePropertyValue<T>(Applicant applicant, T data, string propertyName)
{
long newId = 0;
var listproperty = applicant.GetType().GetProperty(propertyName);
// Here is the problem, even with data in the list, listData.Count is always 0.
List<T> listData = listproperty.GetValue(applicant, null) as List<T>;
// psuedo code
if list is null, create a new list
assign a new Id value to object data (parameter)
Add the data item to the list
update the property of the applicant object with the updated list
return newId;
}
对方法的调用看起来像这样。 test.CreatePropertyValue(申请人,emp,“雇主”);
当我在列表中没有数据的情况下调用此方法时,我会按预期获取该值的null。当我用列表中的数据调用它时,listData的值是一个正确类型的列表,但列表中没有项目。查看listproperty.PropertyType.GetGenericArguments()我可以看到列表中的实际项目。我希望能够基于propertyName获取listData的集合并输入T,然后能够将我的T数据项添加到列表中并将其保存回来。同样,我也需要能够更新,删除和返回列表。
我在网站上看了几个问题,但是没有一个问题向我解释为什么我在列表中使用getvalue时我的列表中包含0个项目。
感谢您提供的任何帮助。
由于
UPDATE :傻傻的我,我正在创建数组和对象,但没有将对象添加到数组中。没什么好看的,继续前进。
答案 0 :(得分:0)
也许,尝试使用lambda:
public void Test1()
{
var app = new Applicant();
CreatePropertyValue(app, new Phone(), a => a.PhoneNumbers, (a, v) => a.PhoneNumbers = v);
CreatePropertyValue(app, new Employer(), a => a.Employers, (a, v) => a.Employers = v);
}
public static long CreatePropertyValue<T>(Applicant applicant, T data, Func<Applicant, List<T>> getter, Action<Applicant, List<T>> setter)
where T : BaseApplicationData
{
long newId = 0;
var list = getter(applicant); //get list
if (list == null) //check it
{
list = new List<T>();
data.Id = newId;
list.Add(data); //add new data
setter(applicant, list); //set new list
}
return newId;
}