35

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?

uSeRnAmEhAhAhAhAhA
  • 2,527
  • 6
  • 39
  • 64
  • 1
    possible duplicate of [get the Type for a object declared dynamic](http://stackoverflow.com/questions/7362532/get-the-type-for-a-object-declared-dynamic) – Erik Philips Apr 17 '14 at 20:57

5 Answers5

32

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();
        }
    }
}
Kamran Bigdely
  • 7,946
  • 18
  • 66
  • 86
uSeRnAmEhAhAhAhAhA
  • 2,527
  • 6
  • 39
  • 64
27

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

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

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

Loz
  • 118
  • 11
Troy Carlson
  • 2,965
  • 19
  • 26
  • 1
    not working `{"Cannot convert type 'System.__ComObject' to 'System.Runtime.Remoting.ObjectHandle'"}` dynamic is not castable to `ObjectHandle` – Franck Dec 01 '21 at 14:01
21

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

Smeegs
  • 9,151
  • 5
  • 42
  • 78
7
dynamic dyn = 1;
Type t = ((object)dyn).GetType();

Works just fine!

Alex Peng
  • 411
  • 5
  • 4
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();
    
Lorenz Lo Sauer
  • 23,698
  • 16
  • 85
  • 87