我正在尝试从不同的列表og对象中删除项目。 我有以下类,在我的情况下,我将获得列表的对象名称,然后我将被要求从该列表中删除项目。是否可以仅通过其对象类型访问特定列表?
作为一个例子,我将获得“TestSubcolleciton”,然后我将不得不访问Subcollecitons列表以删除一些记录。
private class TestClassWithSubcollection : BaseObject
{
public List<TestSubcolleciton> Subcollecitons { get; set; }
public List<TestSubcollecitonSecond> SubcollecitonSeconds { get; set; }
}
protected class TestSubcolleciton
{
protected int Id { get; set; }
}
protected class TestSubcollecitonSecond
{
protected int Id { get; set; }
}
答案 0 :(得分:1)
这可以使用反射来完成,但这可能是一个坏主意。
public static IList GetListByItemType(object instance, Type listItemType)
{
if(instance == null) throw new ArgumentNullException("instance");
if(listItemType == null) throw new ArgumentNullException("listItemType");
Type genericListType = typeof(List<>).MakeGenericType(listItemType);
PropertyInfo property = instance.GetType().GetProperties().FirstOrDefault(p => p.PropertyType == genericListType);
if(property != null)
return (IList)property.GetValue(instance);
return null;
}
返回null或找到List的第一个引用。
然后您可以像这样使用它:
TestClassWithSubcollection instance = ...
IList list = GetListByItemType(instance, typeof(TestSubcollecitonSecond));
if(list != null)
{
// ...
}
如果您需要通过&#34;输入名称&#34;列表项目然后这样做:
public static IList GetListByItemType(object instance, string listItemTypeName)
{
if(instance == null) throw new ArgumentNullException("instance");
if(listItemTypeName== null) throw new ArgumentNullException("listItemTypeName");
PropertyInfo property = instance.GetType().GetProperties().FirstOrDefault(p => p.PropertyType.IsGenericType && p.PropertyType.GetGenericArguments()[0].Name== listItemTypeName);
if(property != null)
return (IList)property.GetValue(instance);
return null;
}
然后使用它:
IList list = GetListByItemType(instance, "TestSubcollecitonSecond");
if(list != null)
{
// ...
}