Får alle variabler inne i en struct av ukjent størrelse (C #)

stemmer
0

Jeg har et prosjekt som jeg har til å få alle variabler fra en struct i en annen klasse, og legge alle navnene deres til en kombinasjonsboks i et skjema. Min primære problemet i øyeblikket er gjentakelse gjennom en struct på en måte som jeg kan legge til hver variabel individuelt til kombinasjonsboksen. Jeg prøvde å gjøre dette:

        msgVars vars = new msgVars();
        foreach (object obj in vars)
        {
            comboBox1.Items.Add(GetName(obj));
        }

men som du sikkert vet, kan du ikke iterere gjennom en struct den måten. Er det noen måte jeg kan gjøre dette uten hardcoding variablene i?

Også for referanse, er dette getName funksjon:

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;
    }
}
Publisert på 06/07/2009 klokken 13:46
kilden bruker
På andre språk...                            


3 svar

stemmer
0

En struct er en enkelt enhet, ikke en samling av variabler. Det betyr at du ikke kan 'iterere' over sine eiendommer. Hva du trenger å gjøre er å få en samling av de egenskapsnavnene og iterere over det. Din getName funksjonen kan ikke gjøre dette fordi det bare returnerer navnet på den første eiendommen.

For å legge til egenskapsnavnene til en kombinasjons alt du trenger å gjøre er å:

 var vars = new msgVars();
 foreach(var name in GetNames(vars))
     comboBox1.Items.Add(name);

Faktisk får eiendommen navn er så enkelt at du kan bli kvitt GetNames completley og bare skrive

  foreach (var prop in typeof(msgVars).GetProperties())
      comboBox1.Items.Add(prop.Name);

Det finnes ulike måter du kan skrive GetNames å returnere en samling av navn. Du kan fylle en liste med egenskapsnavnene selv om det enkleste er å ha det tilbake en iterator som dette:

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

Til slutt, trenger du egentlig ikke trenger å passere en forekomst av struct til metoden, som du er opplisting av structs egenskapsnavn, ikke deres verdier. Du kan skrive GetNames som dette

 public static IEnumerable<string> GetNames<T>() where T:struct
 {
     var properties = typeof (T).GetProperties();
     foreach (var propertyInfo in properties)
     {
        yield return propertyInfo.Name;
     }
  }

og laste navnene som dette

  foreach(var name in GetNames<msgVars>())
      comboBox1.Items.Add(name);
Svarte 19/07/2010 kl. 08:22
kilden bruker

stemmer
0

Du kan prøve å bruke refleksjon. Hva med å lagre informasjonen i en hashtabellen.

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

Deretter kan du skrive informasjon ut via:

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]);    
}
Svarte 06/07/2009 kl. 14:40
kilden bruker

stemmer
0

Hvis du er ute etter en måte å få tilgang til egenskapene til en struct (eller klasse) under kjøring uten predefining i koden som sett med egenskaper, hva trenger du sannsynligvis å bruke er refleksjon.

Her er et eksempel:

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 ) );
    }
}
Svarte 06/07/2009 kl. 14:37
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more