c# – 如何处理使用反射的数组

我正在编写一些验证码.代码将把数据传递到Web服务中,并决定是否可以执行该操作,或者向调用者返回一个消息,这些消息已经丢失了一些字段.

除了数组,我主要工作.我用[requiredField]属性标记属性来表示所需的字段.所以如果这是我的一些数据,

public enum EnumTest
{
    Value1,Value2
}

[DataContract]
public class DummyWebserviceData
{
    [DataMember]
    [requiredField]
    public EnumTest[] EnumTest{ get; set; }

    [DataMember]
    [requiredField]
    public DummyWebserviceData2[] ArrayOfData { get; set; }
}

[DataContract]
public class DummyWebserviceData2
{
    [DataMember]
    [requiredField]
    public string FirstName { get; set;}

    [DataMember]
    [requiredField]
    public string LastName { get; set;}

    [DataMember]
    public string Description { get; set;}
}

我有什么工作?我有验证日期和字符串工作.它使用递归进行数据所需的任何级别.

但是…那么两个阵列呢?第一个一个枚举数组.我想检查这种情况,数组不是空的.

第二个是DummyWebserviceData2值的数组.我需要拉出每个值,并分别看看.

为了简化我写的代码,看起来像这样,

foreach (PropertyInfo propertyInfo in data.GetType().GetProperties())
{
    if (propertyInfo.PropertyType.IsArray)
    {
        // this craps out

        object[] array = (object[])propertyInfo.GetValue(data,new object[] { 0 });

    }
}

所以在我看来,第一件事是我可以告诉它是一个数组.但是我怎么能知道数组中有多少项?

解决方法

在运行时,对象将从Array数据类型( this MSDN topic details that)动态地分类,因此您不需要反映到数组中,可以将对象转换为Array,然后使用Array.GetValue实例方法
Array a = (Array)propertyInfo.GetValue(data);
for(int i = 0; i< a.Length; i++)
{
  object o = a.GetValue(i);
}

您还可以遍历数组,从.Net 2.0起:

In the .NET Framework version 2.0,the Array class implements the System.Collections.Generic::IList,System.Collections.Generic::ICollection,and System.Collections.Generic::IEnumerable generic interfaces.

你不需要知道T,因为从这些你可以得到一个IEnumerable;然后您可以使用Cast()操作,或者确实只是在对象级别工作.

顺便说一下,你的代码不工作的原因是因为不能将MyType []的数组转换成object [],因为object []不是MyType [] – 仅对象的基本类型.

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...