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

uSe*_*AhA 22 .net c# asp.net types dynamic

在我的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;
}
Run Code Online (Sandbox Code Playgroud)

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

Tro*_*son 20

只是在另一个问题上阅读这个...希望它会为你做到这一点:

Type unknown = ((ObjectHandle)tmp).Unwrap().GetType();
Run Code Online (Sandbox Code Playgroud)

阅读并upvote这个问题以获取更多信息: 获取声明为动态的对象的Type


Sme*_*egs 18

你应该只能使用GetType().像这样:

dynamic returnedValue = ReturnThis(value);
var returnType = returnedValue.GetType();
Run Code Online (Sandbox Code Playgroud)

这里有一些关于的更多信息 GetType()

  • 根据另一个答案,`GetType()`似乎不像你在`dynamic`类型上建议的那样. (3认同)
  • 不,动态对象上的 GetType 返回动态类型。没有帮助。 (2认同)

uSe*_*AhA 14

这两种解决方案都适合我.在链接到的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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 7

dynamic dyn = 1;
Type t = ((object)dyn).GetType();
Run Code Online (Sandbox Code Playgroud)

效果很好!


Lor*_*uer 5

给定一个动态类型:

dynamic dynVar;
Type type; 
Run Code Online (Sandbox Code Playgroud)

一个仅仅声明,未初始化的dynamic变量dynVar将抛出类型的异常Microsoft.CSharp.RuntimeBinder.RuntimeBinderException为您执行运行时对空引用结合进行固定-时,反射通过dynVar.GetType()