Как узнать, является ли объект производным от ICollection - PullRequest
1 голос
/ 09 ноября 2011

У меня есть общий список:

IList<T> myobj = new List<T>();

как проверить, является ли myobj универсальный список (он же. IList<T>)?

Я пытался, безуспех:

if(myobj.GetType().IsGenericType && myobj is IList) //second exp is never true

Я не хочу знать тип T в данный момент, я просто хочу знать, является ли myobj списком.

--- EDIT---------------------

'myobj' всегда был нулевым, что приводило к провалу всех проверок.Извините, это моя ошибка.Оказывается, решения, описанные в моих вопросах (которые похожи на некоторые ваши ответы), работают просто отлично.Хотя я не пробовал другие ответы.

Я делал следующее:

PropertyType propInf = ...
var myobj = propInf.GetValue(parentobj,null);//was always null

Ответы [ 5 ]

4 голосов
/ 09 ноября 2011

Вы пробовали (myObj is IList):

    public static void Main(string[] args)
    {
        List<int> foo = new List<int>();
        bool b = foo is IList;  // true
    }

Большинство универсальных интерфейсов сбора в .NET имеют неуниверсальные аналоги (например, IList и IList<T>)

http://msdn.microsoft.com/en-us/library/system.collections.ilist.aspx

2 голосов
/ 09 ноября 2011
typeof(IList<>).IsAssignableFrom(myobj.GetType())
0 голосов
/ 09 ноября 2011
 typeof(IList<T>).IsAssignableFrom(myobj.GetType())

или

 myObj is IList<T>

Причиной сбоя вашего кода является то, что вы используете неуниверсальный список IList вместо универсального списка IList. Это два разных типа в C #.

Более того, чтобы получить все интерфейсы, реализованные вашим объектом, вы можете использовать отражение:

 myObj.GetType().GetInterfaces();
0 голосов
/ 09 ноября 2011

Если оператор "is" не работает, вы можете использовать Type.IsAssignableFrom():

typeof(IList).IsAssignableFrom(obj.GetType());
0 голосов
/ 09 ноября 2011

Вы можете избежать нескольких проверок типов, например:

var list = myObj as IList;
if (list != null)
{
    //do something with it
}

Аналогичный код, использующий is, требует двух проверок типа, одну для оператора is и одну для приведения:

if (myObj is IList)
{
    var list = (IList)myObj;
    //do something with it
}

Хотя я озадачен, почему ваш myobj is IList всегда ложен.Это должно быть правдой.Возможно, у вас есть класс, который реализует IList<T>, но не IList.IList<T> не наследуется от IList.

Если вы действительно хотите знать, реализует ли объект IList<T>, попробуйте это

foreach (var interfaceType in myobj.GetType().GetInterfaces())
    if (interfaceType.IsGenericType)
        if (interfaceType.GetGenericTypeDefinition() == typeof(IList<>))
            return true;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...