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
Question
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?
Solution 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
OTHER TIPS
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();
}
}
}
You should just be able to use GetType()
. Like so:
dynamic returnedValue = ReturnThis(value);
var returnType = returnedValue.GetType();
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();
dynamic dyn = 1;
Type t = ((object)dyn).GetType();
Works just fine!