我正在编写一些验证码.代码将把数据传递到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 [] – 仅对象的基本类型.