David
David

Reputation: 15350

How to detect if an object is of type generic List and cast to the required type?

I have an extension method for converting a generic list to string.

public static string ConvertToString<T>(this IList<T> list)
{
    StringBuilder sb = new StringBuilder();
    foreach (T item in list)
    {
        sb.Append(item.ToString());
    }
    return sb.ToString();
}

I have an object which is of type object that holds a list; the list could be List<string>, List<int>, List<ComplexType> any type of list.

Is there a way that I can detect that this object is a generic list and therefore cast to that specific generic list type to call the ConvertToString method?

//ignore whats happening here
//just need to know its an object which is actually a list
object o = new List<int>() { 1, 2, 3, 4, 5 };

if (o is of type list)
{
    string value = (cast o to generic type).ConvertToString();
}

Upvotes: 7

Views: 1462

Answers (3)

rusty
rusty

Reputation: 2789

Instead of coding the extension method against IList<T>, you could code it against IEnumerable, then it'd be:

public static string ConvertToString(this IEnumerable list)
{
    StringBuilder sb = new StringBuilder();
    foreach (object item in list)
    {
        sb.Append(item.ToString());
    }
    return sb.ToString();
}

Then you could check if o is an IEnumerable:

object o = new List<int>() { 1, 2, 3, 4, 5 };

if (o is IEnumerable)
{
    string value = ((IEnumerable) o).ConvertToString();
}

Upvotes: 2

Adi
Adi

Reputation: 5223

Use System.Type to see if your type is an arrat (IsArray) and if it's a generic type (IsGenericType)

Upvotes: 0

Marc Gravell
Marc Gravell

Reputation: 1062640

You can achieve that, with lots of reflection (both to find the correct T, and then to invoke via MakeGenericMethod etc); however: you aren't using the generic features, so remove them! (or have a secondary non-generic API):

public static string ConvertToString(this IEnumerable list)
{
    StringBuilder sb = new StringBuilder();
    foreach (object item in list)
    {
        sb.Append(item.ToString());
    }
    return sb.ToString();
}

and

IList list = o as IList;
if (list != null)
{
    string value = list.ConvertToString();
}

(you can also use IEnumerable in the above step, but you need to be careful with string etc if you do that)

Upvotes: 6

Related Questions