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

C# 如何在运行时检查动态数据类型的类型?,c#,asp.net,.net,dynamic,types,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 P

在我的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;
}
public动态返回此(动态值)
{
if(someConditionIsMet)
{
值=真;
}
其他的
{
value=new List().Add(new Person(){Name=“Travis”});
}
返回值;
}

我的问题是,我想在调用此方法后,在处理或读取其数据之前,确定值的
datatype
。但我不确定如何检查
动态值的类型。我该怎么做呢?

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

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

请在另一个SO问题上阅读此内容……希望它能帮到你:

Type unknown = ((ObjectHandle)tmp).Unwrap().GetType();
阅读并向上投票此问题以了解更多信息:
这两种解决方案对我都有效。在链接到的Smeegs文档中,提到了
is
关键字。我提出了一个更具可读性的解决方案:

if(值为布尔值){}
if(值为列表){}


工作测试:

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();
        }
    }
}
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
命名空间控制台应用程序3348
{
班级计划
{
班主任
{
字符串名称=”;
}
静态void Main(字符串[]参数)
{
Console.WriteLine(“将列表分配给值”);
动态值=新列表();
如果(值为列表)
{
Console.WriteLine(“值是一个列表”);
}
值=假;
Console.WriteLine(“将布尔赋值”);
if(值为布尔值)
{
Console.WriteLine(“值为bool”);
}
Console.Read();
}
}
}
给定动态类型:

dynamic dynVar;
Type type; 
仅声明的、未初始化的
dynamic
变量
dynVar
将引发 通过
dynVar.GetType()执行类型反射时,在空引用上执行运行时绑定时键入Microsoft.CSharp.RuntimeBinder.RuntimeBinderException

  • 正如“Troy Carlson”所指出的那样,人们可以通过远程控制使用相当缓慢的方法:

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

     type = dynVar == null ? null : dynVar.GetType();
    
  • 或者

     type = dynVar?.GetType();
    

很好用

根据另一个答案,
GetType()
似乎不像您在
dynamic
类型上建议的那样。它应该适用于
string
boolean
等基本类型,但我不是100%不,动态对象上的GetType返回类型dynamic。没有帮助。可能是重复的
 type = dynVar?.GetType();
dynamic dyn = 1;
Type t = ((object)dyn).GetType();