繁体   English   中英

使用C#反射读取对象数组的元素

[英]Read elements of an array of objects using C# reflection

如何使用反射获取c#中对象数组的元素和数据类型列表?

场景:我的Web服务(asmx)中有一个带数组参数的方法。 使用反射我正在读取方法参数并循环遍历属性。 这是我的代码:


示例:我有一个Web服务http://localhost/services/myservice.asmx 它有一个方法string GetServiceData(context mycontext) 上下文类具有以下属性

- string name
- Account[] accounts

帐户反过来了

- string acct_name
- string acct_address

我需要动态读取服务以生成以下输出

<GetServiceData>
    <mycontext>
        <name>string</name>
        <accounts>
            <acct_name>string</acct_name>
            <acct_address>string</acct_address>
        </accounts>
    </mycontext>
</GetServiceData>

为此,我动态地读取MethodInfo并获取所有参数。 然后我遍历参数以获取所有属性和数据类型的列表。 如果属性中有数组元素,那么我需要获取该数组元素的所有元素。

解决方案(感谢Ani)


foreach (MethodInfo method in methods)
{
    sb.Append("<" + method.Name + ">");
    ParametetInfo parameters = method.GetParameters();
    foreach(ParameterInfo parameter in parameters)
    {
        sb.Append("<" + parameter.Name + ">");
        if (IsCustomType(parameter.ParameterType))
        {
           sb.Append(GetProperties(parameter.ParameterType));
        }
        else
        {
            sb.Append(parameter.ParameterType.Name);
        }
        sb.Append("</" + parameter.Name + ">");
    }
    sb.Append("</" + sMethodName + ">");
}

GetProperties()方法读取类型并实际循环遍历每个属性并将其添加到字符串对象。 在这个方法中,我想检查属性是否是一个数组,然后获取它的所有元素和类型。

public static string GetProperties(Type type)
{
    StringBuilder sb = new StringBuilder();
    foreach(PropertyInfo property in type.GetProperties())
    {
        sb.Append("<" + property.Name + ">");

        if (property.PropertyType.IsArray)
        {
            Type t = property.PropertyType.GetElementType();
            sb.Append(GetProperties(t));
        }
        else
        {
            sb.Append(property.PropertyType.name);
        }
    }
    sb.ToString();
}

我认为您要查找Type.IsArray属性(指示类型是否为数组)和Type.GetElementType方法(除其他外,获取数组的元素类型)。 请注意,数组的元素类型不一定与数组中每个元素的特定运行时类型相同; 多态性可以发挥作用。

当然,要简单地获取值,您可以依赖于数组协方差:将属性的值(我假设您在某处使用PropertyInfo.GetValue )转换为object[]并像往常一样预测。

编辑

您的更新非常混乱。 如果您已经有一个您认为可能是数组的对象 ; 你不妨这样做:

object obj = ...

object[] array = obj as object[];

if(array != null)
{
   foreach(object item in array)
   {
      ...
   }      
}

看起来好像你在这里将元数据与实际数据混淆了。 如果您拥有的是表示数组类型System.Type ,则实际上无法枚举任何数组。

编辑

我想我终于明白了你想做什么。 只需使用Type.GetElementType获取数组的元素类型,然后获取类型的属性(递归?)。 你可能会稍微改变你的设计,以获得你想要的XML输出。 XML表示层次结构; 但是你的方法的return-type只是一个Dictionary<string, string> ,它是一个扁平的数据结构。

您可以检查PropertyInfo.PropertyType属性。 像这样:

if (propertyInfo.PropertyType.IsArray)
{
   // Type is an array
}

更新:如果您只想获取数组的属性,可以像这样使用GetElementType

    ...
    //How to check for an array??? and add it to objProp dictionary
    if (property.PropertyType.IsArray)
    {
        //??? how to read all the elements of an array 
        objProp = GetProperties(property.PropertyType.GetElementType());
    }
    ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM