web-dev-qa-db-fra.com

Comment vérifier le type de type de données dynamique au moment de l'exécution?

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?

18
uSeRnAmEhAhAhAhAhA

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

17
Troy Carlson

Vous devriez juste pouvoir utiliser GetType(). Ainsi:

dynamic returnedValue = ReturnThis(value);
var returnType = returnedValue.GetType();

Voici quelques informations supplémentaires sur GetType()

14
Smeegs

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();
        }
    }
}
10
uSeRnAmEhAhAhAhAhA

É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();
    
2
Lorenz Lo Sauer