获取未知大小的结构中的所有变量(C#)

时间:2009-07-06 13:46:06

标签: c# combobox struct

我有一个项目,我必须从另一个类的结构中获取所有变量,并将它们的所有名称添加到表单中的组合框中。我目前的主要问题是迭代结构,我可以将每个变量分别添加到组合框中。我试过这样做:

        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;
    }
}

3 个答案:

答案 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);