Sri*_*ddy 4 c# arrays reflection dynamic object
如何使用反射获取c#中对象数组的元素和数据类型列表?
场景: 我的Web服务(asmx)中有一个带数组参数的方法.使用反射我正在读取方法参数并循环遍历属性.这是我的代码:
示例:
我有一个Web服务http://localhost/services/myservice.asmx.它有一种方法string GetServiceData(context mycontext).上下文类具有以下属性
- string name
- Account[] accounts
Run Code Online (Sandbox Code Playgroud)
帐户反过来了
- string acct_name
- string acct_address
Run Code Online (Sandbox Code Playgroud)
我需要动态读取服务以生成以下输出
<GetServiceData>
<mycontext>
<name>string</name>
<accounts>
<acct_name>string</acct_name>
<acct_address>string</acct_address>
</accounts>
</mycontext>
</GetServiceData>
Run Code Online (Sandbox Code Playgroud)
为此,我动态地读取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 + ">");
}
Run Code Online (Sandbox Code Playgroud)
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();
}
Run Code Online (Sandbox Code Playgroud)
我认为您要查找Type.IsArray属性(指示类型是否为数组)和Type.GetElementType方法(除其他外,获取数组的元素类型).请注意,数组的元素类型不一定与数组中每个元素的特定运行时类型相同; 多态性可以发挥作用.
当然,要简单地获取值,您可以依赖于数组协方差:将属性的值(我假设您正在使用PropertyInfo.GetValue某个地方)转换为object[]和往常一样.
编辑:
您的更新非常混乱.如果您已经有一个您认为可能是数组的对象 ; 你不妨这样做:
object obj = ...
object[] array = obj as object[];
if(array != null)
{
foreach(object item in array)
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
看起来好像你在这里将元数据与实际数据混淆了.如果您拥有的System.Type只是表示数组类型的数组,则实际上无法枚举任何数组.
编辑:
我想我终于明白了你想做什么.只是Type.GetElementType用来获取数组的元素类型,然后获取该类型的属性(递归?).你可能会稍微改变你的设计,以获得你想要的XML输出.XML表示层次结构; 但是你的方法的返回类型只是Dictionary<string, string>一个平面数据结构.
| 归档时间: |
|
| 查看次数: |
12766 次 |
| 最近记录: |