例如
public ClassA
{
   private IList<ClassB> _field1;
   private string _field2;
   public  IList<ClassB> Field1{get;set;}
   public string Field2{get;set;}
....
   
}
public ClassB
{
   private string _f;
   public F{set;get;}
}假设 已经封装好一个 IList<ClassA> 
如何用泛型方法 遍历出这个泛型集合所有属性值,主要是Field1 的所有属性值:如F
现在方式是,用 
public static string SerializeList<T>(IList<T> objList)
{
 if (objList == null || objList.Count <= 0)
   return null;
  System.Reflection.PropertyInfo[] mPi = typeof(T).GetProperties();
  string strName = "", strValue = "";
  string strName1 = "", strValue1 = "";
    foreach (T t in objList)
            {
                if (t == null)
                    continue;
                for (int i = 0; i < mPi.Length; i++)
                {
                    System.Reflection.PropertyInfo pi = mPi[i];
                    strName = pi.Name.Replace("_", "");
                    strValue = pi.GetValue(t, null) == null ? string.Empty : pi.GetValue(t, null).ToString();
                    if (pi.PropertyType.IsGenericType)
                    {
                         此处如何获取我需要的泛型对象,然后遍历出内部值
                    }
                 }
             }
}
补充:由于要实现通用方法来遍历,所以用泛型方法.
各位有什么高见,小弟不胜感激

解决方案 »

  1.   

    你这里的T和前面的ClassA、ClassB有什么关系?
      

  2.   

    ...这是泛型方法,用的时候比如已经封装好了一个 IList<ClassA> 类型的有数据的对象 ClassAList
    调用这个方法来遍历这个对象的所有property 即 SerializeList<ClassA>(ClassAList)
      

  3.   

    问题是SerializeList<ClassA>(ClassAList) 这里第一次指明了ClassA可以反射实现得到基本类型数据值,
    可是 如何获取IList<ClassB > 的每个对象属性值
      

  4.   

    当ClassB 本身支持序列化时,IList<ClassB>即支持序列化,那么你直接对IList<ClassB>这个整体序列化即可,而不需要自己去遍历属性序列化。
      

  5.   

    谢这位兄台热心帮助,不过正因为类中有实现IDictionary类型的成员,所以不可以用系统的那个方法实现
      

  6.   

    你在遍历属性的时候,判断每个属性是否可序列化,可序列化则直接序列化,不要继续判断其内部属性了,如果遇到不可序列化,则遍历可序列化的属性来序列化,对于你这里的IList<ClassB>肯定是可以直接序列化的。
      

  7.   

    那不如直接实现IXmlSerializable,到哪里都通用。不过估计楼主要对一些非自己定义的不可序列化类型进行序列化,那你的做法就不可行了。例如要序列化Control类型的对象,而Control是无法序列化的,特别是系统自带的Control,但是可以通过遍历属性的方式来序列化其属性。
      

  8.   


    我的方法什么类都是可以序列化的举个简单的例子
        interface ISerializable
        {
            string Serialize();
        }    public class A : ISerializable
        {
            public List<int> x { get; set; }
            public string y { get; set; }        public string Serialize()
            {
                StringBuilder r = new StringBuilder();
                r.Append("{");
                r.Append("\"x\":[");
                foreach (int n in x)
                {
                    r.AppendFormat("{0},", n);
                }
                if (x.Count > 0)
                {
                    r.Remove(r.Length - 1, 1);
                }
                r.Append("]");
                r.AppendFormat(",\"y\":\"{0}\"", y);
                r.Append("}");
                return r.ToString();
            }
        }
    如果你再说行不通我也不知道说啥好了。。
      

  9.   

    我又仔细看了下方法,除非你将所有自定义类型(也就是你上面所谓的ClassA和ClassB)都带上,也就是说你的泛型方法定义恐怕得这样写。。public static string SerializeList<T,T1>(IList<T> objList)
    {
    }当然,如果你的ClassA里还有其他自定义类型的属性,那么你将会传入更多的T2,T3之类的。。在数据结构位置的情况下,反射是无法做到的!
      

  10.   

    你最好把你最终目的说出来,从你问的看出,你选择的方法并非最佳方法,但是你不说出最终要实现的目的,就不能帮你选更好的方法实现。单单
      if (pi.PropertyType.IsGenericType)
      {
      此处如何获取我需要的泛型对象,然后遍历出内部值
      }
    这里面即使你能获取属性,也达不到任何效果(我可以告诉你如何获取,但没意义),因为对于IList<T>,IDictionary<TKey,TValue>这两种类型,必须单独处理,也就是判断为这样的类型后,就强制类型转换到该类型上处理,如果直接获取其属性,将得到不需要的Count、IsFixedSize、IsReadOnly等属性,而你实际只需要那个Item属性即可遍历所有元素了。
      

  11.   


    需求:想用一个方法统一处理 序列化各种复杂泛型对象,
    问题:系统自带的序列化方法:
    1.如果遇到空值就会有空标签,但是不想有.
    2.如果想动态指定只序列化对象的某一些属性,而不是全部([XmlIgnore]只能定死不序列化谁,但现在需要动态指定),好像也不能实现.
    希望有方法解决
      

  12.   

    你还是没说出你的目的,只说了你想象中的方法。我先说你的这个“用一个方法统一处理 序列化各种复杂泛型对象”这个方法是完全没必要的,根本不需要考虑所序列化的对象是否是泛型,例如如下的一个泛型类:
    public class MyClass<T>
    {
        public T 属性1{get;set;}
    }
    你肯定是要问,这个泛型类如何获取其所有属性?这难道和普通类有区别吗?MyClass<string> obj = new MyClass<string>();
    obj.属性1 = "测试值";
    object property = obj.GetType().GetProperties()[0].GetValue(obj, null);
    Type propertyType = property.GetType();这些获取方法和一般类完全没有两样,只有当你反射泛型方法的时候才需要考虑泛型类型的传递。
      

  13.   

    我想知道的是你序列化对象干嘛用,序列化的是自定义的类型还是系统自带类型,是否要自定义属性过滤。
    这三个是关键点,不说清楚就不能选择最佳序列化方式,比如上面cuitstudio_andy提到的方法,只能适用于自定义类型,系统自带类型就不能用。另外对于二进制序列化和xml序列化再或者Json序列化,方式又有差异,这些你不关注的要点却是问题的关键。
      

  14.   

    引用 17 楼 的回复:
    你最好把你最终目的说出来,从你问的看出,你选择的方法并非最佳方法,但是你不说出最终要实现的目的,就不能帮你选更好的方法实现。单单
    if (pi.PropertyType.IsGenericType)
    {
    此处如何获取我需要的泛型对象,然后遍历出内部值
    }
    这里面即使你能获取属性,也达不到任何效果(我可以告诉你如何获取,但没意义),如何取?希望这位兄台能实践一下再说
      

  15.   

    实现后变成了string 具体干吗用,我想对于如何实现这个过程来说没有关系吧.系统的序列化方法不易控制,手工遍历第二次反射就需要指定传入相应的泛型参数,不灵活,希望有其他途径可以解决,如果仅仅是基本数据类型那么简单,我也就不用在这里麻烦各位了,不过还是谢谢这位仁兄这么热心了.期待有好的方案处理这个问题.