如何在运行时检查动态数据类型的类型?

时间:2014-04-17 20:49:43

标签: c# asp.net .net dynamic types

在我的ASP.NET网站中,我有一个返回类型dynamic的值的方法。根据某些标准和结果,此方法将返回布尔值或SortedList。

要粘贴的代码太多,但例如:

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

    return value;
}

我的问题是,我想在执行或读取其数据之前调用此方法后确定值的datatype。但我不确定如何检查dynamic value的类型。我怎么能这样做?

5 个答案:

答案 0 :(得分:19)

请在另一个问题上阅读此内容...希望它能为您解决问题:

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

阅读并提交此问题以获取更多信息: get the Type for a object declared dynamic

答案 1 :(得分:13)

您应该能够使用GetType()。像这样:

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

Here is some more information on GetType()

答案 2 :(得分:12)

这两种解决方案都适合我。在链接到的Smeegs文档中,提到了is关键字。我想出了一个更易读的解决方案:

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


工作测试:

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

答案 3 :(得分:3)

给定动态类型:

dynamic dynVar;
Type type; 

一个仅仅声明的,未初始化的dynamic变量dynVar将抛出异常 在通过{{1}执行Type- Reflection 时,在执行对空引用的运行时绑定时,键入 Microsoft.CSharp.RuntimeBinder.RuntimeBinderException }。

  • 正如特洛伊卡尔森&#34;所指出的那样,人们可以通过远程MarshalByRefObject使用相当慢的方法:

    dynVar.GetType()
  • 但对任何其他类型进行简单的空检查就足够了:

     Type type = ((ObjectHandle)dynVar).Unwrap().GetType();
     // > type...is null
    
  • ...或

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

答案 4 :(得分:0)

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

工作正常!