Cast dynamic to List<T>

25,029

I see no reason why it should fail, unless FetchData is improper data.

Possibility I: FetchData is returning null, and hence the type parameter cannot be figured out (null has no type in C#).

Possibility II: FetchData is not returning a proper List<T> object.

I would redesign the thing like:

private static void GetData()
{
   dynamic dynamicList = FetchData();

   if (dynamicList is IEnumerable) //handles null as well
       FilterAndSortDataList(Enumerable.ToList(dynamicList));

   //throw; //better meaning here.
}

It checks whether the returned type is IEnumerable (hoping that it is some IEnumerable<T> - we cant check if it is IEnumerable<T> itself since we dont have T with us. Its a decent assumption) in which case we convert the obtained sequence to List<T>, just to be sure we are passing a List<T>. dynamic wont work with extension methods, so we have to call Enumerable.ToList unfortunately. In case dynamicList is null or not an enumerable it throws which gives it better meaning than some run time binding error.

Share:
25,029
BrokeMyLegBiking
Author by

BrokeMyLegBiking

Love application development and crazy mountain bike trails. No fear, just broken legs.

Updated on January 18, 2020

Comments

  • BrokeMyLegBiking
    BrokeMyLegBiking over 4 years
    private static void GetData()
    {
       dynamic dynamicList =FetchData();
       FilterAndSortDataList(dynamicList);
    }
    
    private static void FilterAndSortDataList<T>(List<T> dataList)
    {
        ...
    }
    

    I am getting a runtime binding error when I call FilterAndSortDataList. Is there a way to cast my dynamicList to List<T> at runtime?

    Note that FetchData() is implimented by plugins, so I don't know in advance what the type T is.

  • Hamlet Hakobyan
    Hamlet Hakobyan over 10 years
    After dynamic dynamicList = new List<string> (); dynamicList is List<string> and no need to cast.
  • Yinda Yin
    Yinda Yin over 10 years
    @HamletHakobyan: Yeah, I think D's point is that the element type is not known at compile time.
  • Hamlet Hakobyan
    Hamlet Hakobyan over 10 years
    @RobertHarvey If you don't know element type at compile time you can't cast it directly. :)
  • Yinda Yin
    Yinda Yin over 10 years
    @HamletHakobyan: So true. But there are some magic tricks that might work; see the comments I posted below the OP.
  • Servy
    Servy over 10 years
    @RobertHarvey It doesn't matter whether he knows the type at compile time or not, since he's using dynamic. Clearly the actual value is an array or a string or something that's not any kind of list, since it failed. If it was any kind of list, even if he doesn't know the generic argument at compile time, then his code would work.
  • Servy
    Servy over 10 years
    @RobertHarvey As I said from the start for it to fail requires the actual object within the variable to not actually be a list. Without knowing what it actually is, we can't know how to turn it into a list.
  • Yinda Yin
    Yinda Yin over 10 years
    @Servy I did, in fact, agree with you.
  • BrokeMyLegBiking
    BrokeMyLegBiking over 10 years
    since I don't know the type at compile time, this doesn't work.
  • Yinda Yin
    Yinda Yin over 10 years
    @BrokeMyLegBiking: To cast it to a List<T> you will have to divine what's in the dynamic, and then perform some sort of reflection magic to reflect over the members and stuff them into a list.