2013-08-09 4 views
2
private static void GetData() 
{ 
    dynamic dynamicList =FetchData(); 
    FilterAndSortDataList(dynamicList); 
} 

private static void FilterAndSortDataList<T>(List<T> dataList) 
{ 
    ... 
} 

Я получаю ошибку привязки во время выполнения при вызове FilterAndSortDataList. Есть ли способ сделать мой динамический список List<T> во время выполнения?Динамическое преобразование в список <T>

Обратите внимание, что FetchData() внедряется плагинами, поэтому я не знаю заранее, что такое тип T.

+0

Нужно на самом деле * быть * список для работы. Тот факт, что он дает эту ошибку, означает, что объект фактически не является списком. – Servy

+0

Здесь может быть какая-то помощь: http://stackoverflow.com/q/5014235 и здесь: http://stackoverflow.com/questions/513952 –

+0

Какой объект фактически находится в переменной 'dynamic'? Другими словами, что возвращает 'FetchData()'? –

ответ

0

Есть ли способ бросить мой dynamicList в список во время выполнения

Я не знаю, почему вы объявляете его как динамический, когда он должен быть List<T>, но я предполагаю, что это потому что вы не знаете, что такое T. Если вы сделали, вы можете просто бросить его прямо:

private static void GetData() 
{ 
    dynamic dynamicList = new List<string>(); 
    FilterAndSortDataList((List<string>)dynamicList); 
} 

private static void FilterAndSortDataList<T>(List<T> dataList) 
{ 
    ... 
} 

, но очевидно, что может не во время выполнения.

Другим вариантом может быть сделать GetData родовое, а также:

private static void GetData<T>() 
{ 
    List<T> list = new List<T>(); 
    FilterAndSortDataList(list); 
} 

private static void FilterAndSortDataList<T>(List<T> dataList) 
{ 
    ... 
} 
+1

После 'dynamic dynamicList = new List ();' dynamicList is 'List ' и не нужно делать. –

+0

@HamletHakobyan: Да, думаю, точка D состоит в том, что тип элемента не известен во время компиляции. –

+0

@RobertHarvey Если вы не знаете тип элемента во время компиляции, вы не можете его напрямую использовать. :) –

1

Я не вижу причин, почему она должна потерпеть неудачу, если FetchData не несобственные данные.

Возможность I: FetchData возвращает значение null, и поэтому параметр типа не может быть вычислен (значение null не имеет типа в C#).

Возможность II: FetchData не возвращает надлежащего List<T> объект.

Я бы перепроектировать вещи, как:

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

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

    //throw; //better meaning here. 
} 

Он проверяет, является ли возвращаемый тип IEnumerable (в надежде, что это какой-то IEnumerable<T> - мы не можем проверить, если он IEnumerable<T> сам, так как мы не имеем T с нами. Это достойное предположение), в этом случае мы преобразуем полученную последовательность в List<T>, чтобы убедиться, что мы проходим List<T>. dynamic не работает с методами расширения, поэтому мы должны назвать Enumerable.ToList к сожалению. В случае, если dynamicList является нулевым или не перечислимым, это дает ему лучший смысл, чем некоторая ошибка привязки времени выполнения.

Смежные вопросы