tags:

views:

653

answers:

3

I have a class (A web control) that has a property of type IEnumerable and would like to work with the parameter using LINQ.

Is there any way to cast / convert / envoke via reflection to IEnumerable<T> not knowing the type at compile time?

Method void (IEnumerable source)
{
    var enumerator = source.GetEnumerator();

    if (enumerator.MoveNext())
    {
        var type = enumerator.Current.GetType();
        Method2<type>(source); // this doesn't work! I konw!
    }
}

void Method2<T>(IEnumerable<T> source) {}
+2  A: 

You probably want to refactor your code to use IEnumerable.Cast<T>

Use it like this:

IEnumerable mySet = GetData();
var query = from x in mySet.Cast<int>()
            where x > 2
            select x;
Brian Genisio
Requires the type at compile time. Same issue.
Andrew Robinson
That is correct. And so does Method2. You could always cast to an IEnumerable<object>...
Brian Genisio
+9  A: 

Does your Method2 really care what type it gets? If not, you could just call Cast<object>():

void Method (IEnumerable source)
{
    Method2(source.Cast<object>());
}

If you definitely need to get the right type, you'll need to use reflection.

Something like:

    MethodInfo method = typeof(MyType).GetMethod("Method2");
    MethodInfo generic = method.MakeGenericMethod(type);
    generic.Invoke(this, new object[] {source});

It's not ideal though... in particular, if source isn't exactly an IEnumerable<type> then the invocation will fail. For instance, if the first element happens to be a string, but source is a List<object>, you'll have problems.

Jon Skeet
Works. Simple. Exactly what I was looking for.
Andrew Robinson
+1  A: 

Have a look at this website:

http://shortfastcode.blogspot.com/2009/12/convert-from-ienumerable-to-ienumerable.html

Daniel