C#'Da Class'ın Propertieslerini Dolaşmak?
-
Hata loglaması yapıyorumda session'a atadığım bir class daki propertiesleri kolay yoldan loga yazdırmak istiyorum. Class daki propertiesleri kolay olarak for yada foreach ile dolaşmam mümkün mü?
-
"eventhandler"
-
Senin_Class instance = new Senin_Class();
PropertyInfo[] properties = instance.GetType().GetProperties();foreach property in properties
property nin ise .GetValue() su olucak. Ise yarar mi ?
-
class A { public string Pro1 { get { return "value1"; } } } class Program { static void Main(string[] args) { A a = new A(); System.Reflection.PropertyInfo[] pi = a.GetType().GetProperties(); for (int i = 0; i < pi.Length; ++i) Console.WriteLine(pi[0].Name + " " + pi[0].GetValue(a, null).ToString()); Console.ReadLine(); } }http://msdn.microsoft.com/en-us/library/kyaxdd3x.aspx
ancak bencede eventhandler mekanizmasi daha uygun olurdu ;-)
-
Eyvallah yukardaki kodlar işimi görücek ama. Event handler kullanmaktan kastınızı anlamadım?
-
GrN bunu yazdı:
-----------------------------class A { public string Pro1 { get { return "value1"; } } } class Program { static void Main(string[] args) { A a = new A(); System.Reflection.PropertyInfo[] pi = a.GetType().GetProperties(); for (int i = 0; i < pi.Length; ++i Console.Linepi0.Name + " " + pi0.GetValuea, null.To; Console.ReadLine;http://msdn.microsoft.com/en-us/library/kyaxdd3x.aspx
ancak bencede eventhandler mekanizmasi daha uygun olurdu ;-)
-----------------------------
Kodda bir hata var p[0] değilde p[i] ile yazılması gerekiyor. -
sinirlerim bozukken kod yazmamam gerektigini hatirlattigin icin tesekkur ederim :-)
-
GrN bunu yazdı:
-----------------------------sinirlerim bozukken kod yazmamam gerektigini hatirlattigin icin tesekkur ederim :-)
-----------------------------
hocam sinirlerin yumuşakken şu eventhandlerdan kastını açıklarmısın? -
simdi eventhandler olayi isin icine giriyosa eger, senin log tutma sekline bagli olarak bu mekanizmanin iyi yada kotu oldugu hakkinda konusabiliriz.
yani sen belli anlarda(yada belli araliklarla diyelim) sinifin ozelliklerindeki degerleri dosyaya yazacaksan, bunu reflection kutuphanesiyle yaparsin(yani ustte verdigim koddaki gibi).
ama amacin her(yada herhangi) ozellik bilgisi degistiginde yada belli bi olay gerceklestiginde bunu dosyaya yansitmaksa, eventhandler kullanirsin.
ornegin A sinifinin Pro1 propertysi degistiginde bunu log dosyasina aninda yansiticaksan, eventhandler mekanizmasi sana daha uygun bi cozum getirir.
asagida basit bi ornek yaptim konuyla alakali
class A { public delegate void delProperty_Changed(string name, object value); public event delProperty_Changed Property_Changed; private string m_Pro1; public string Pro1 { get { return m_Pro1; } set { m_Pro1 = value; Property_Changed("Pro1", value); } } } class Program { static void Main(string[] args) { A a = new A(); a.Property_Changed += new A.delProperty_Changed(a_Property_Changed); a.Pro1 = "TEST"; Console.ReadLine(); } static void a_Property_Changed(string name, object value) { Console.WriteLine("\n {0}:{1}", name, value); } } -
GrN bunu yazdı:
-----------------------------simdi eventhandler olayi isin icine giriyosa eger, senin log tutma sekline bagli olarak bu mekanizmanin iyi yada kotu oldugu hakkinda konusabiliriz.
yani sen belli anlarda(yada belli araliklarla diyelim) sinifin ozelliklerindeki degerleri dosyaya yazacaksan, bunu reflection kutuphanesiyle yaparsin(yani ustte verdigim koddaki gibi).
ama amacin her(yada herhangi) ozellik bilgisi degistiginde yada belli bi olay gerceklestiginde bunu dosyaya yansitmaksa, eventhandler kullanirsin.
ornegin A sinifinin Pro1 propertysi degistiginde bunu log dosyasina aninda yansiticaksan, eventhandler mekanizmasi sana daha uygun bi cozum getirir.
asagida basit bi ornek yaptim konuyla alakali
class A { public delegate void delProperty_Changed(string name, object value); public event delProperty_Changed Property_Changed; private string m_Pro1; public string Pro1 { get { return m_Pro1; } set { m_Pro1 = value; Property_Changed("Pro1", value); } } } class Program { static void Main(string[] args) { A a = new A(); a.Property_Changed += new A.delProperty_Changed(a_Property_Changed); a.Pro1 = "TEST"; Console.ReadLine(); } static void a_Property_Changed(string name, object value) { Console.WriteLine("\n {0}:{1}", name, value); } }
-----------------------------
Şimdi anladım hocam kastettiğinizi. Benim bunu istememdeki amaç şeydi Application_Error event'inde oluşan hataları log'latıyorum ve Session'dada UserClass'ı tutuyorum. Loglara daha ayrıntılı bilgi girmek içinde Sessionda tuttuğun Class'ın propertieslerinin o anki durumunuda kaydetmek istemiştim. Eyvallah.
