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

36
在我的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;
}

我遇到的问题是,在对某个值调用方法之后,在对其数据进行操作或读取之前,我想确定该值的数据类型。但我不知道如何检查动态值的类型。我该怎么做?


1
可能是获取声明为dynamic的对象的类型的重复问题。 - Erik Philips
5个回答

34

两种方案对我都有效。在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();
        }
    }
}

27
刚刚在另一个SO的问题上看到这个...希望它能对你有帮助:
Type unknown = ((ObjectHandle)value).Unwrap().GetType();

阅读并点赞此问题以获取更多信息: 获取声明为动态的对象的类型

1
无法工作 {"Cannot convert type 'System.__ComObject' to 'System.Runtime.Remoting.ObjectHandle'"},动态类型无法转换为ObjectHandle - Franck

21

4
根据另一个答案,似乎GetType()dynamic类型上的行为并不像您所建议的那样。 - mason
1
它应该适用于原始类型,如“string”和“boolean”,但我不是100%确定。 - Smeegs
2
不,对于动态对象的GetType返回类型dynamic并不有用。 - dr d b karron

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

运行良好!


这个不起作用,它返回 {Name = "__ComObject" FullName = "System.__ComObject"} - Franck

5

给定一个动态类型:

dynamic dynVar;
Type type; 

一个仅声明但未初始化的 dynamic 变量 dynVar,在进行类型-Reflection 时通过 dynVar.GetType() 会抛出一个 Microsoft.CSharp.RuntimeBinder.RuntimeBinderException 类型的异常,因为你在对一个空引用进行运行时绑定

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接