How do I check type of dynamic datatype at runtime?
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();
Comments
-
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 typedynamic value
is. How can I do this? -
mason about 10 yearsAccording to the other answer,
GetType()
doesn't seem to behave as you're suggesting ondynamic
types. -
Smeegs about 10 yearsIt should for primitive types like
string
andboolean
, but I'm not 100% -
dr d b karron over 5 yearsno, GetType on a dynamic object returns the type dynamic. not helpful.
-
Franck over 2 yearsThis does not work it return
{Name = "__ComObject" FullName = "System.__ComObject"}
-
Franck over 2 yearsnot working
{"Cannot convert type 'System.__ComObject' to 'System.Runtime.Remoting.ObjectHandle'"}
dynamic is not castable toObjectHandle