How do I check type of dynamic datatype at runtime?

66,658

Solution 1

Just read this on another SO question...hopefully it will do the trick for you:

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

Read and upvote this question for more info: get the Type for a object declared dynamic

Solution 2

Both solutions are working for me. In the documentation Smeegs linked to, the is keyword was mentioned. And I came up with a slightly more readable solution:

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


A working test:

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

Solution 3

You should just be able to use GetType(). Like so:

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

Here is some more information on GetType()

Solution 4

dynamic dyn = 1;
Type t = ((object)dyn).GetType();

Works just fine!

Solution 5

Given a dynamic type:

dynamic dynVar;
Type type; 

A merely declared, uninitialized dynamic variable dynVar will throw an exception of Type Microsoft.CSharp.RuntimeBinder.RuntimeBinderException as you are performing runtime binding on a null reference, when performing Type-Reflection via dynVar.GetType().

  • As pointed out by "Troy Carlson", one may use, the rather slow method via a remoted MarshalByRefObject:

     Type type = ((ObjectHandle)dynVar).Unwrap().GetType();
     // > type...is null
    
  • But a simple null check as for any other type would suffice:

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

     type = dynVar?.GetType();
    
Share:
66,658
uSeRnAmEhAhAhAhAhA
Author by

uSeRnAmEhAhAhAhAhA

A Sydney-based Web Developer.

Updated on June 10, 2020

Comments

  • uSeRnAmEhAhAhAhAhA
    uSeRnAmEhAhAhAhAhA about 4 years

    In my ASP.NET website, I have a method that returns a value of type dynamic. This method, depending on certain criteria and results, will then either return a Boolean value or SortedList.

    There is too much code to paste, but for example:

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

    My problem is, I would like to determine the datatype of value after calling this method before acting on or reading its data. But I am unsure how to check what type dynamic value is. How can I do this?

  • mason
    mason about 10 years
    According to the other answer, GetType() doesn't seem to behave as you're suggesting on dynamic types.
  • Smeegs
    Smeegs about 10 years
    It should for primitive types like string and boolean, but I'm not 100%
  • dr d b karron
    dr d b karron over 5 years
    no, GetType on a dynamic object returns the type dynamic. not helpful.
  • Franck
    Franck over 2 years
    This does not work it return {Name = "__ComObject" FullName = "System.__ComObject"}
  • Franck
    Franck over 2 years
    not working {"Cannot convert type 'System.__ComObject' to 'System.Runtime.Remoting.ObjectHandle'"} dynamic is not castable to ObjectHandle