如何创建类的变量列表
问题描述:
请帮助我,我有一类这个类型的:如何创建类的变量列表
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);
}
}
}
却是尽管事实上在单独的线程很慢,它运行
答
您可以使用反射来获取类的成员名单:
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
答
由于意见不编译,你的程序将需要访问源代码(Class文件),您将需要一个C#编译器。通常情况下,您可以使用Roslyn这是新的C#编译器,为这类任务提供API。 Visual Studio 2015使用它来提供编辑器功能,如智能感知和代码分析。
-
你能修改类,并添加注释说明属性?
[Description("1-1")] [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] public double x;
那么你可以使用反射API在运行时获取的描述:
FieldInfo.GetCustomAttribute<DescriptionAttribute>()
如果你可以重写你的字段属性,你可以使用
TypeDescriptor
类,这是更适合这种任务的。看看项目为WPF PropertyGrid或PropertyTools以及
这类型究竟你需要一个列表?为什么你会忽略评论? – HimBromBeere
是否要生成文档? – Dzienny
HimBromBeere:我需要列表,Dzienny:不,我需要在列表框中显示这些变量的列表 –
XmaksasX