Search code examples
c#genericssystem.reflection

Providing array of types as method parameter


I have a fairly simple method:

public static LinkItemCollection ToList<T>(this LinkItemCollection linkItemCollection)
{
    var liCollection = linkItemCollection.ToList(true);
    var newCollection = new LinkItemCollection();

    foreach (var linkItem in liCollection)
    {
        var contentReference = linkItem.ToContentReference();
        if (contentReference == null || contentReference == ContentReference.EmptyReference)
            continue;

        var contentLoader = ServiceLocator.Current.GetInstance<IContentLoader>();
        IContentData content = null;
        var epiObject = contentLoader.TryGet(contentReference, out content);
        if (content is T)
            newCollection.Add(linkItem);
    }

    return newCollection;
}

This works fine - I can call the method and provide a type as T. However, what I want to be able to do is to be able to specify multiple types. I therefore, wrongly, assumed I could refactor the method to:

public static LinkItemCollection ToList(this LinkItemCollection linkItemCollection, Type[] types)
{
    var liCollection = linkItemCollection.ToList(true);
    var newCollection = new LinkItemCollection();

    foreach (var linkItem in liCollection)
    {
        var contentReference = linkItem.ToContentReference();
        if (contentReference == null || contentReference == ContentReference.EmptyReference)
            continue;

        foreach (var type in types)
        {
            var contentLoader = ServiceLocator.Current.GetInstance<IContentLoader>();
            IContentData content = null;
            var epiObject = contentLoader.TryGet(contentReference, out content);
            if (content is type)
                newCollection.Add(linkItem);
        }
    }

    return newCollection;
}

However, Visual Studio is showing it cannot resolve the symbol for type on the line if(content is type).

I know I'm doing something wrong, and I'm guessing I need to use Reflection here.


Solution

  • What you're looking for is:

    type.IsAssignableFrom(content.GetType())
    

    is is only used for checking against a type known at compile time, not at runtime.