How do I check type of dynamic datatype at runtime?

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?

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

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

Method 2

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

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

Method 4

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

Method 5

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

Works just fine!


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x