我有一个项目,我必须从另一个类的结构中获取所有变量,并将它们的所有名称添加到表单中的组合框中。我目前的主要问题是迭代结构,我可以将每个变量分别添加到组合框中。我试过这样做:
msgVars vars = new msgVars();
foreach (object obj in vars)
{
comboBox1.Items.Add(GetName(obj));
}
但是你可能知道,你不能以这种方式迭代结构。如果不对变量进行硬编码,有什么方法可以做到这一点吗?
另外,作为参考,这是GetName函数:
static string GetName<T>(T item) where T : struct
{
var properties = typeof(T).GetProperties();
if (properties.Length == 1)
{
return properties[0].Name;
}
else
{
return null;
}
}
答案 0 :(得分:0)
如果您正在寻找一种在运行时访问结构(或类)的属性而无需在代码中预定义该属性集的方法,那么您可能需要使用的是反射。
以下是一个例子:
struct MyStruct
{
private readonly int m_Age;
private readonly string m_LastName;
private readonly string m_FirstName;
public int Age { get { return m_Age; } }
public string LastName { get { return m_LastName; } }
public string FirstName { get { return m_FirstName; } }
public MyStruct( int age, string last, string first )
{
m_Age = age;
m_LastName = last;
m_FirstName = first;
}
}
class StructReflection
{
public static void Main(string[] args)
{
var theStruct = new MyStruct( 40, "Smith", "John" );
PrintStructProperties( theStruct );
}
public static void PrintStructProperties( MyStruct s )
{
// NOTE: This code will not handle indexer properties...
var publicProperties = s.GetType().GetProperties();
foreach (var prop in publicProperties)
Console.WriteLine( "{0} = {1}", prop.Name, prop.GetValue( s, null ) );
}
}
答案 1 :(得分:0)
您可以尝试使用Reflection。如何将信息存储在Hashtable中。
public Hashtable GetPropertyInfo(Person person)
{
var properties = new Hashtable();
PropertyInfo[] propInfo = person.GetType().GetProperties();
foreach (PropertyInfo prop in propInfo)
{
properties.Add(prop.Name, prop.GetValue(person, null));
}
return properties;
}
然后你可以通过以下方式写出信息:
var person = new Person()
Person.Name = "Test";
Person.Age = 21;
var PropertyInfo = GetPropertyInfo(person);
foreach (string key in PropertyInfo.Keys)
{
Console.WriteLine("{0} = {1}", key, PropertyInfo[key]);
}
答案 2 :(得分:0)
结构是单个实体,而不是变量的集合。这意味着您无法“迭代”其属性。您需要做的是获取属性名称的集合并迭代它。您的GetName函数无法执行此操作,因为它只返回第一个属性的名称。
要将属性名称添加到组合中,您只需:
var vars = new msgVars();
foreach(var name in GetNames(vars))
comboBox1.Items.Add(name);
事实上,获取属性名称是如此简单,以至于你可以摆脱GetNames的完整性而只是写
foreach (var prop in typeof(msgVars).GetProperties())
comboBox1.Items.Add(prop.Name);
有多种方法可以编写GetNames来返回一组名称。您可以使用属性名称填充List,尽管最简单的方法是让它返回如下的迭代器:
public static IEnumerable<string> GetNames<T>(T obj) where T:struct
{
var properties = typeof (T).GetProperties();
foreach (var propertyInfo in properties)
{
yield return propertyInfo.Name;
}
}
最后,您实际上不需要将结构的实例传递给方法,因为您要枚举结构属性名称,而不是它们的值。您可以像这样重写GetNames
public static IEnumerable<string> GetNames<T>() where T:struct
{
var properties = typeof (T).GetProperties();
foreach (var propertyInfo in properties)
{
yield return propertyInfo.Name;
}
}
并加载像这样的名称
foreach(var name in GetNames<msgVars>())
comboBox1.Items.Add(name);