Kezdjük azzal, hogy lekérdezzük egy adott objektum property-eit és azok tulajdonságait. Példaként a Form-al tesszük ezt. Ehhez egy Type osztályra lesz szükségünk. A Form GetType függvénye pont ezt szolgáltatja visszatérési értékként, így könnyű dolgunk van. Ahhoz, hogy megtudjuk e típusnak a property-eit, ahhoz használnunk kell a GetProperties függvényt. Ez a függvény egy PropertyInfo osztályokat tartalmazó tömböt ad vissza. A tömb minden egyes eleme egy-egy property-nek az információt tartalmazza.
protected void button1_Click (object sender, System.EventArgs e)
{
Type t = this.GetType();
PropertyInfo[] p = t.GetProperties();
string[] s = new string[3];
Miután rendelkezésre áll a szükséges információ, most már csak meg kell jelenítenünk azt. Ehhez egy foreach ciklust használunk, mellyel végigmegyünk a tömb minden elemén. A PropertyInfo osztály Name property-e árulja el az adott property nevét. Ha a CanRead property igaz, akkor az adott property olvasható. Ha a CanWrite property igaz, akkor az adott property értéke meg is változtatható. Ha kíváncsiak vagyunk, hogy mi az adott property típusa, akkor ezt a PropertyType property-n keresztül határozhatjuk meg. Ezen belül a FullName property egy olyan sztringet ad vissza, mely utal a típus minősített megnevezésére, pl.: System.Int32.
foreach(PropertyInfo i in p)
{
s[0] = i.Name;
s[1] = i.CanRead.ToString();
s[2] = i.CanWrite.ToString();
s[3] = i.PropertyType.FullName;
listView1.Items.Add(new ListViewItem(s));
}
Egy-egy objektumnak nem csak lekérdezhetjük a property-eit, hanem közvetve el is érhetjük azokat, módosíthatjuk akár értéküket is. Ezt felhasználva könnyen készíthetünk egy olyan függvényt, melynek három paramétert adunk át:
- melyik objektumot akarjuk elérni
- melyik property-ét akarjuk elérni
- mi legyen a megadott objektum megadott property-ének új értéke
protected void button2_Click (object sender, System.EventArgs e)
{
SetPropertyValueByName(this, "BackColor", Color.AliceBlue);
}
Most már csak el kell készítenünk a SetPropertyValueByName nevű belső függvényünket és ettől kezdve bármilyen típusú objektum, bármely property-ének tetszőleges értéket adhatunk úgy, hogy az elérni kívánt property-t csak a nevével, egy sztringen keresztül azonosítjuk.
A megvalósítás a következő: a paraméterként kapott objektumról szintén kérünk egy típus információt a GetType függvénnyel. Második lépésként lekérjük a megadott property-ét a GetProperty függvénnyel. Itt paraméterként a kérdéses property nevét kell megadnunk sztringként. Visszatérési értékként kapunk egy PropertyInfo típusú objektumot. Ennek SetValue hívásával pedig tetszőlegesen módosíthatjuk a property aktuális értékét.
private void SetPropertyValueByName(object Object, string PropertyName, object NewValue)
{
Type t = Object.GetType();
PropertyInfo p = t.GetProperty(PropertyName);
p.SetValue(Object, NewValue, null);
}