Как проверить тип динамического типа данных во время выполнения?

На моем веб-сайте ASP.NET у меня есть метод, который возвращает значение типа dynamic. Этот метод, в зависимости от определенных критериев и результатов, будет либо возвращать логическое значение, либо SortedList.

Слишком много кода для вставки, но, например:

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

    return value;
}

Моя проблема заключается в том, что я хотел бы определить значение datatype после вызова этого метода, прежде чем действовать или читать его данные. Но я не уверен, как проверить тип dynamic value. Как я могу это сделать?

Ответ 3

Оба решения работают на меня. В документации, связанной с Smeegs, было указано ключевое слово is. И я придумал несколько более читаемое решение:

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


Рабочее испытание:

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

Ответ 4

Для динамического типа:

dynamic dynVar;
Type type; 

Только объявленная, неинициализированная переменная dynamic dynVar вызовет исключение из Введите Microsoft.CSharp.RuntimeBinder.RuntimeBinderException, когда вы выполняете привязку времени выполнения по нулевой ссылке при выполнении Type-Reflection через dynVar.GetType().

  • Как указано в "Трой Карлсон", можно использовать довольно медленный метод через удаленный MarshalByRefObject:

     Type type = ((ObjectHandle)dynVar).Unwrap().GetType();
     // > type...is null
    
  • Но достаточно простой проверки нуля, как и для любого другого типа:

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

     type = dynVar?.GetType();