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

disho6za  于 2023-08-08  发布在  .NET
关注(0)|答案(5)|浏览(124)

在我的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是什么类型。我该怎么办?

1sbrub3j

1sbrub3j1#

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

字符串

enxuqcxy

enxuqcxy2#

只要在另一个SO问题上阅读这篇文章......希望它能为你做点什么:

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

字符串
阅读并支持此问题以获取更多信息:get the Type for a object declared dynamic

9q78igpj

9q78igpj3#

您应该可以使用GetType()。就像这样:

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

字符串
Here is some more information on GetType()

yqhsw0fo

yqhsw0fo4#

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

字符串
工作刚刚好!

hivapdat

hivapdat5#

给定一个动态类型:

dynamic dynVar;
Type type;

字符串
通过dynVar.GetType()执行Type-Reflection 时,仅声明、未初始化的dynamic变量dynVar将抛出TypeMicrosoft.CSharp.RuntimeBinder.RuntimeBinderException的异常,因为您正在执行运行时绑定空引用

  • 正如“Troy Carlson”所指出的,可以通过远程MarshalByRefObject使用相当慢的方法:
Type type = ((ObjectHandle)dynVar).Unwrap().GetType();
 // > type...is null

  • 但是对于任何其他类型,一个简单的null检查就足够了:
type = dynVar == null ? null : dynVar.GetType();

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

相关问题