webentwicklung-frage-antwort-db.com.de

Wie überprüfe ich den Typ des dynamischen Datentyps zur Laufzeit?

Auf meiner ASP.NET-Website gibt es eine Methode, die einen Wert des Typs dynamic zurückgibt. Diese Methode gibt dann je nach bestimmten Kriterien und Ergebnissen entweder einen booleschen Wert oder eine SortedList zurück.

Es gibt zu viel Code zum Einfügen, aber zum Beispiel:

public dynamic ReturnThis(dynamic value)
{
    if(someConditionIsMet)
    {
        value = true;
    }
    else
    {
        value = new List<String>().Add(new Person() { Name = "Travis" });
    }

    return value;
}

Mein Problem ist, ich möchte die Variable datatype ermitteln, nachdem ich diese Methode aufgerufen habe, bevor sie ihre Daten bearbeitet oder gelesen hat. Aber ich bin nicht sicher, wie ich den Typ dynamic value prüfen soll. Wie kann ich das machen?

18

Lesen Sie dies einfach in einer anderen SO Frage ... hoffentlich wird es Ihnen helfen:

Type unknown = ((ObjectHandle)tmp).Unwrap().GetType();

Lesen und bestätigen Sie diese Frage für weitere Informationen: Holen Sie sich den Typ für ein Objekt, das als dynamisch deklariert wird

17
Troy Carlson

Sie sollten nur GetType() verwenden können. So wie:

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

Hier finden Sie weitere Informationen zu GetType()

14
Smeegs

Beide Lösungen arbeiten für mich. In der Dokumentation, auf die Smeegs verlinkt ist, wurde das Schlüsselwort is erwähnt. Und ich habe mir eine etwas lesbarere Lösung ausgedacht:

if(value is Boolean) { } und if(value is List<Person>) { }


Ein Arbeitstest:

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

Bei einem dynamischen Typ:

dynamic dynVar;
Type type; 

Eine lediglich deklarierte, nicht initialisierte Variable dynamicdynVar löst eine Ausnahme von .__ aus. Geben Sie Microsoft.CSharp.RuntimeBinder.RuntimeBinderException ein, wenn Sie die runtime-Bindung für eine Nullreferenz ausführen, wenn Sie Type -Reflection ausführen über dynVar.GetType()

  • Wie von "Troy Carlson" beschrieben, kann man die eher langsame Methode über ein entferntes MarshalByRefObject verwenden:

     Type type = ((ObjectHandle)dynVar).Unwrap().GetType();
     // > type...is null
    
  • Eine einfache Nullprüfung wie für jeden anderen Typ würde jedoch ausreichen:

     type = dynVar == null ? null : dynVar.GetType();
    
  • oder...

     type = dynVar?.GetType();
    
2
Lorenz Lo Sauer