Cast dynamique dans la Liste des<T>
private static void GetData()
{
dynamic dynamicList =FetchData();
FilterAndSortDataList(dynamicList);
}
private static void FilterAndSortDataList<T>(List<T> dataList)
{
...
}
Je suis une liaison de runtime erreur quand je l'appelle FilterAndSortDataList. Est-il un moyen de jeter mon dynamicList à List<T>
au moment de l'exécution?
Noter que FetchData() est implimented par les plugins, donc je ne sais pas à l'avance ce que le type T est.
- Il doit en fait être une liste pour que cela fonctionne. Le fait qu'elle donne cette erreur signifie que l'objet n'est pas d'une liste.
- Il peut y avoir un peu d'aide ici: stackoverflow.com/q/5014235 et ici: stackoverflow.com/questions/513952
- De quel type d'objet est en fait dans le
dynamic
variable? En d'autres termes, ce n'FetchData()
retour?
Vous devez vous connecter pour publier un commentaire.
Je ne vois pas pourquoi elle devrait échouer, à moins que
FetchData
est abusive des données.Possibilité I:
FetchData
est de retour null, et donc le type de paramètre ne peut pas être compris (null n'a pas de type en C#).Possibilité II:
FetchData
n'est pas le retour d'un bonList<T>
objet.Je voudrais refonte de la chose comme:
Il vérifie si le type retourné est
IEnumerable
(en espérant que c'est quelqueIEnumerable<T>
- nous ne pouvons pas vérifier si il estIEnumerable<T>
lui-même, car nous n'avons pasT
avec nous. Ses décent assomption) dans ce cas, nous convertir la séquence obtenue àList<T>
, juste pour être sûr, nous sommes passer unList<T>
.dynamic
l'habitude de travailler avec des méthodes d'extension, de sorte que nous devons appelerEnumerable.ToList
malheureusement. En casdynamicList
est null ou non une énumération il jette qui lui donne sens mieux qu'à certains moment de l'exécution de liaison d'erreur.Je ne sais pas pourquoi vous déclarer comme dynamique quand il a un
List<T>
, mais je suppose que c'est parce que vous ne savez pas ceT
est. Si vous ne, vous pouvez simplement directement de voter pour elle:mais évidemment cela peut échouer lors de l'exécution.
Une autre option pourrait être de faire
GetData
générique ainsi:dynamic dynamicList = new List<string> ();
dynamicList estList<string>
et pas besoin de cast.dynamic
. Clairement la valeur réelle est un tableau ou une chaîne ou quelque chose qui est pas n'importe quel type de liste, car elle n'est pas. Si c'était le genre de liste, même s'il ne connaît pas l'argument générique au moment de la compilation, puis son code de travail.List<T>
vous devrez divine ce qui est de la dynamique, puis effectuer une sorte de reflet de la magie à réfléchir sur les membres et les choses dans une liste.