首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用C#反射读取对象数组的元素

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

Stack Overflow用户
提问于 2011-03-14 18:51:15
回答 2查看 14.2K关注 0票数 4

如何获得c#中带有反射的对象数组的元素和数据类型列表?

场景: web ()中有一个带有数组参数的方法()。使用反射,我正在读取方法参数并遍历这些属性。这是我的代码:

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

代码语言:javascript
运行
复制
- string name
- Account[] accounts

转帐

代码语言:javascript
运行
复制
- string acct_name
- string acct_address

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

代码语言:javascript
运行
复制
<GetServiceData>
    <mycontext>
        <name>string</name>
        <accounts>
            <acct_name>string</acct_name>
            <acct_address>string</acct_address>
        </accounts>
    </mycontext>
</GetServiceData>

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

解决方案(感谢Ani)

代码语言:javascript
运行
复制
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()方法读取类型并实际循环每个属性,并将其添加到string对象中。在这个方法中,我想检查属性是否是数组,然后获取它的所有元素和类型。

代码语言:javascript
运行
复制
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();
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-14 18:54:36

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

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

编辑

你的更新很让人困惑。如果您已经有一个您认为可能是数组的对象,那么您也可以这样做:

代码语言:javascript
运行
复制
object obj = ...

object[] array = obj as object[];

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

看起来你把元数据和真实数据搞混了。如果您所拥有的只是一个表示数组类型的System.Type,则实际上不能枚举任何数组。

编辑

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

票数 9
EN

Stack Overflow用户

发布于 2011-03-14 18:57:57

您可以检查PropertyInfo.PropertyType属性。如下所示:

代码语言:javascript
运行
复制
if (propertyInfo.PropertyType.IsArray)
{
   // Type is an array
}

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

代码语言:javascript
运行
复制
    ...
    //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());
    }
    ...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5303018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档