Sur mon site Web ASP.NET, une méthode renvoie une valeur de type dynamic
. Cette méthode, en fonction de certains critères et résultats, renverra alors une valeur booléenne ou SortedList.
Il y a trop de code à coller, mais par exemple:
public dynamic ReturnThis(dynamic value)
{
if(someConditionIsMet)
{
value = true;
}
else
{
value = new List<String>().Add(new Person() { Name = "Travis" });
}
return value;
}
Mon problème est, je voudrais déterminer la datatype
de valeur après avoir appelé cette méthode avant d'agir ou de lire ses données. Mais je ne sais pas comment vérifier le type dynamic value
. Comment puis-je faire ceci?
Lisez simplement ceci sur une autre SO question ... espérons que cela fera l'affaire pour vous:
Type unknown = ((ObjectHandle)tmp).Unwrap().GetType();
Lisez et votez cette question pour plus d’informations: Obtenir le type d’un objet déclaré dynamique
Vous devriez juste pouvoir utiliser GetType()
. Ainsi:
dynamic returnedValue = ReturnThis(value);
var returnType = returnedValue.GetType();
Les deux solutions fonctionnent pour moi. Le mot clé is
a été mentionné dans la documentation associée à Smeegs. Et je suis venu avec une solution légèrement plus lisible:
if(value is Boolean) { }
et if(value is List<Person>) { }
Un test de travail:
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication3348
{
class Program
{
class Person
{
string Name = "";
}
static void Main(string[] args)
{
Console.WriteLine("Assigning List to value");
dynamic value = new List<Person>();
if (value is List<Person>)
{
Console.WriteLine("value is a list");
}
value = false;
Console.WriteLine("Assigning bool to value");
if (value is Boolean)
{
Console.WriteLine("value is bool");
}
Console.Read();
}
}
}
Étant donné un type dynamique:
dynamic dynVar;
Type type;
Une variable dynamic
simplement déclarée et non initialisée dynVar
lève une exception de Type Microsoft.CSharp.RuntimeBinder.RuntimeBinderException lorsque vous exécutez la liaison runtime sur une référence null lors de l'exécution de Type -Réflexion via dynVar.GetType()
.
Comme le souligne "Troy Carlson", on peut utiliser la méthode plutôt lente via une commande à distance MarshalByRefObject :
Type type = ((ObjectHandle)dynVar).Unwrap().GetType();
// > type...is null
Mais un simple contrôle nul comme pour tout autre type suffirait:
type = dynVar == null ? null : dynVar.GetType();
ou...
type = dynVar?.GetType();