是否可以通过对象类型使用对象中的列表?

时间:2015-01-22 17:33:01

标签: c# asp.net

我正在尝试从不同的列表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; }
        }

1 个答案:

答案 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)
{
    // ...
}