Is there a way to cast type parameter?

Can I use type parameter as implementing specific interface at Runtime without Reflection? The following pseudocode is what I want to do.

void Run1<T> ()
{
    // ...
    if (typeof (IEnumerable).IsAssignableFrom (typeof (T)) {
        Run2<T implementing IEnumerable> (); // <- use T as implementing IEnumerable
    }
    // ...
}

void Run2<T> () where T : IEnumerable
{
    // ...
}
Jon Skeet
people
quotationmark

No, I don't believe there's a simple way you can do that.

If you're in control of all the code, you could have a public version of Run2 with the constraint, but a private implementation of Run2 without the constraint, which you call from Run1:

public void Run1<T>()
{
    // ...
    if (typeof(IEnumerable).IsAssignableFrom(typeof(T))
    {
        Run2Impl<T>();
    }
    // ...
}

public void Run2<T>() where T : IEnumerable
{
    Run2Impl<T>();
}

private void Run2Impl<T>()
{
    // Need to cast any values of T to IEnumerable here
}

people

See more on this question at Stackoverflow