对象类型的转换

本文关键字:转换 类型 对象 | 更新日期: 2023-09-27 18:14:35

我有一个Object response类型的方法参数。我使用

遍历对象
foreach (PropertyDescriptor descriptor in TypeDescriptor.GetProperties(response))
{
    string name = descriptor.Name;
    object value = descriptor.GetValue(response);
    Console.WriteLine("{0}={1}", name, value);
    if (name.Contains("StatusData"))
    {
        //loop thorugh StatusDataReponse properties
    }

当对象包含StatusData的属性时,我需要将其转换为StatusDataResponse并循环它的属性。我来自vb.net,不知道如何在c#中做到这一点。

对象类型的转换

既然知道了类型,就可以直接转换值:

if (name.Contains("StatusData"))
{
    //loop thorugh StatusDataReponse properties
    StatusDataReponse response = value as StatusDataReponse;
    if (response != null)
    {
       // Use response as needed
    }
}

你读过c#中的协方差和逆变,试着使用它。我认为如果价值是继承的财产,它会起作用。如果我错了,请评论。

 if (name.Contains("StatusData"))
    {
        //loop thorugh StatusDataReponse properties
        StatusDataReponse response = (StatusDataReponse)value;
        if (response != null)
        {
           // Use response as needed
        }
    }

真的直截了当:

    foreach (PropertyDescriptor descriptor in TypeDescriptor.GetProperties(response))
    {
        string name = descriptor.Name;
        object value = descriptor.GetValue(response);
        Console.WriteLine("{0}={1}", name, value);
        if (name.Contains("StatusData"))
        {
            foreach (PropertyDescriptor descriptor in TypeDescriptor.GetProperties(value))
            {
               ...
            }
        }
    }

如果我是你,我不会检查名字,而只检查类型。这样你就安全了:

  1. 所有名称与StatusData不同但类型为StatusDataReponse的属性。
  2. 所有名称为StatusData但不是StatusDataReponse类型的属性。

的做法

foreach (PropertyDescriptor descriptor in TypeDescriptor.GetProperties(response))
{
    string name = descriptor.Name;
    object value = descriptor.GetValue(response);
    StatusDataReponse statusData = value as StatusDataReponse; 
    if (statusData == null)
    {
        Console.WriteLine("{0}={1}", name, value);
    }
    else
    {
        //loop thorugh StatusDataReponse properties
    }