2015-07-10 75 views
-1

请帮助我,我有一类这个类型的:如何创建类的变量列表

class Class1 
{ 
    ///<summary>1</summary> 
    [StructLayout(LayoutKind.Sequential, Pack = 1)] 
    public class Point 
    { 
     ///<summary>1-1</summary> 
     public double x; 
    }; 

    ///<summary>2</summary> 
    [StructLayout(LayoutKind.Sequential, Pack = 1)] 
    public class Base : Point 
    { 
     ///<summary>2-1</summary> 
     [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] 
     public char[] Name; 
     ///<summary>2-2</summary> 
     public UInt64 type; 
     ///<summary>2-3</summary> 
     [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)] 
     public char[] Model; 
    }; 

    ///<summary>3</summary> 
    [StructLayout(LayoutKind.Sequential, Pack = 1)] 
    public class Object : Base 
    { 
     ///<summary>3-1</summary> 
     public int State; 
     ///<summary>3-2</summary> 
     public double G; 
     ///<summary>3-3</summary> 
     public float L; 
     ///<summary>3-4</summary> 
     public Point M = new Point(); 
     ///<summary>3-4</summary> 
     [MarshalAs(UnmanagedType.ByValArray, SizeConst = 25)] 
     public char[] fdsArrNull; 
    }; 
} 

如何从这个类中创建的变量列表,我怎么可以从评论变量?

我需要一个列表,得到的变量和评论,但没有值的名称。

谢谢您的回复,如果类是小的,然后它工作得很好,但如果类是大是因为它有可能加速这一进程很慢?我有一个非常大的课,我需要去触摸它100次,第二次,我抚摸它,我喜欢这样

public static List<KeyValuePair<string, string>> listData_Obj = new List<KeyValuePair<string, string>>(); 
     private static void Get_data_from_obj() 
     { 
      FieldInfo[] fields = Obj.GetType().GetFields(); 
      listData_Obj.Clear(); 
      foreach (FieldInfo field in fields) 
      { 
       MN = field.Name; 
       if (field.FieldType.Namespace.Equals("System")) 
       { 

        if (field.FieldType.Name == "Char[]") 
        { 
         char[] char_field = (char[])field.GetValue(Obj); 
         string str = new string(char_field); 
         listData_Obj.Add(new KeyValuePair<string, string>(MN, str.TrimEnd('\0'))); 
        } 
        else 
        { 
         listData_Obj.Add(new KeyValuePair<string, string>(MN, field.GetValue(Obj).ToString())); 
        } 
       } 
       else 
       { 
        var fields_of_field = field.GetValue(Obj); 
        foreach (var field2 in fields_of_field.GetType().GetFields()) 
        { 
         if (field2.FieldType.Namespace.Equals("System")) 
         { 

          if (field2.FieldType.Name == "Char[]") 
          { 
           var char_field = (char[])field2.GetValue(fields_of_field); 
           string str = new string(char_field); 
           listData_Obj.Add(new KeyValuePair<string, string>(MN+"."+field2.Name, str.TrimEnd('\0'))); 
          } 
          else 
          { 
           listData_Obj.Add(new KeyValuePair<string, string>(MN + "." + field2.Name, field2.GetValue(fields_of_field).ToString())); 
          } 
         } 
         else 
         { 
          var str = MN + "." + field2.Name + "."; 
          recurs(field2, fields_of_field, str); 
         } 
        } 
       } 
      } 
     } 

     static void recurs(FieldInfo field, dynamic fields_of_field,string strn) 
     { 

      var fields_of_field2 = field.GetValue(fields_of_field); 
      foreach (var field2 in fields_of_field2.GetType().GetFields()) 
      { 
       if (field2.FieldType.Namespace.Equals("System")) 
       { 
        if (field2.FieldType.Name == "Char[]") 
        { 
         var char_field = (char[])field2.GetValue(fields_of_field2); 
         string str = new string(char_field); 
         listData_Obj.Add(new KeyValuePair<string, string>(strn+"."+MN+"."+field2.Name, str.TrimEnd('\0'))); 
        } 
        else 
        { 
         listData_Obj.Add(new KeyValuePair<string, string>(strn + "." + MN + "." + field2.Name, field2.GetValue(fields_of_field2).ToString())); 
        } 
       } 
       else 
       { 
        var str1 = strn + MN + "." + field2.Name + "."; 
        recurs(field2, fields_of_field2, str1); 
       } 
      } 
     } 

却是尽管事实上在单独的线程很慢,它运行

+1

这类型究竟你需要一个列表?为什么你会忽略评论? – HimBromBeere

+0

是否要生成文档? – Dzienny

+0

HimBromBeere:我需要列表,Dzienny:不,我需要在列表框中显示这些变量的列表 – XmaksasX

回答

1

您可以使用反射来获取类的成员名单:

FieldInfo[] fields = obj.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.FlattenHierarchy | BindingFlags.Instance); 

然后处理阵列来获得会员的名单。

List<string> mylist = new List<string>(); 
foreach (var field in fields) 
    mylist.Add(field.Name); 

如果您想要基类的字段名称,您可以递归到结构中。下面的代码将字段名称添加到另一个级别(这样您可以获得M.x) - 如果需要,可以将其转换为递归函数。玩弄代码来获得你需要的结果。

List<String> ml = new List<string>(); 
    foreach (var field in fields) 
    { 
    String MN = field.Name; 
    ml.Add(MN); 

    if (field.FieldType.Namespace.Equals("System")) 
     continue; 

    FieldInfo[] fields2 = field.FieldType.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.FlattenHierarchy | BindingFlags.Instance); 
    if (fields2.Length == 0) 
     continue; 
    foreach (var field2 in fields2) 
    { 
     ml.Add(MN + "." + field2.Name); 
    } 
    } 

请注意,它明确不会为系统定义类型添加所有字段名称 - 您可以将它限制为仅检查名称空间中定义的类型。

我不认为这是可能获得在运行时的意见(虽然我很高兴对被纠正)。请参阅:Programmatically get Summary comments at runtime

+0

非常感谢您的帮助,那么,我只会得到M,我需要X public Point M = new Point(); – XmaksasX

+0

请参阅编辑以解决此问题。 – PaulF

1
  1. 由于意见不编译,你的程序将需要访问源代码(Class文件),您将需要一个C#编译器。通常情况下,您可以使用Roslyn这是新的C#编译器,为这类任务提供API。 Visual Studio 2015使用它来提供编辑器功能,如智能感知和代码分析。

  2. 你能修改类,并添加注释说明属性?

    [Description("1-1")] 
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] 
    public double x; 
    

    那么你可以使用反射API在运行时获取的描述:

    FieldInfo.GetCustomAttribute<DescriptionAttribute>() 
    

    如果你可以重写你的字段属性,你可以使用TypeDescriptor类,这是更适合这种任务的。看看项目为WPF PropertyGridPropertyTools以及