PDA

View Full Version : سوال: شمارش خاصیت های موجود در یک کلاس



MehdiAhmadi
دوشنبه 05 تیر 1391, 10:59 صبح
سلام.
کسی می دونه چطوری می شه خاصیت های موجود در یک کلاس را شمرد. به عنوان نمونه در دات نت کلاسی به نام Cursors وجود داره که توی اون لیست تمامی کرزرهای موجود جهت استفاده در برنامه قرار گرفته. سوالم اینه جطوری می شه توسط برنامه لیست تمامی آیتم های موجود در این کلاس (نام کرزرها=Cursors.Arrow ، Cursors.Hand و ...) بازبینی بشه و توی یک لیست نمایش داده بشه؟
ممنون از تمامی دوستان:خجالت:

MehdiAhmadi
سه شنبه 06 تیر 1391, 08:00 صبح
یه بزرگوار نیست جواب سوال منو بده؟:گریه:

Hybrid
سه شنبه 06 تیر 1391, 10:14 صبح
ســلام به شما دوست عزیز ، یک مثال واستون میزنم واسه بقیه هم به صورت مشابه امکان پذیر هست :

1 ) 2 فضای نامی System.data.sqlclient و System.Reflection رو به برنامتون اضافه کنید.

2 ) یک Button و یک Listbox به فرمتون اضافه کنید و کد زیر رو داخل رویداد Click دکمه بزارید و نتیجه رو مشاهده کنید :


Dim my_con As New SqlConnection
Dim tp As System.Type = my_con.GetType()
Dim pi() As PropertyInfo = tp.GetProperties()

For Each i As PropertyInfo In pi
ListBox1.Items.Add(i.Name)
Next

** کد بالا تمامی خاصیت های کلاس sqlConnection رو در لیست باکس نشون میده .

این لینک (http://www.vb-helper.com/howto_net_display_cursors.html) زیر هم میتونه کمکتون کنه .
یا این لینک
(http://msdn.microsoft.com/en-us/library/ms839526.aspx)داخل گوگل هم جستجو کنید نتیجه های خوبی رو واستون میاره.

موفق باشید

MehdiAhmadi
سه شنبه 06 تیر 1391, 14:55 عصر
دوست عزیز صمیمانه از کدی که گذاشتی ممنون و سپاسگذارم. این کد در مواقعی که یک کلاس حاوی روتین New باشه جواب می ده اما در کلاسی مثل Cursors جوابگو نیست.:گریه:

Hybrid
سه شنبه 06 تیر 1391, 15:31 عصر
آره حق با شمائه یادم رفت این نکته رو بگم ، ولی اون 2 تا لینکی رو که آدرسش رو قرار دادم دقیقا همون کدی که میخواین رو داره !

از لینک پایینی استفاده کنید مربوط به MSDN هست.

MehdiAhmadi
چهارشنبه 07 تیر 1391, 13:31 عصر
دوست عزیز از حسن توجهت ممنون اما من برای بررسی مثال نتونستم ارتباط درستی بین فرم برنامه ، کرزرهای موجود در یک لیست باکس و تابع ارایه شده توسط MSDN برقرار کنم. امکانش هست برنامه ای در این رابطه و تنها جهت شمارش نام کرزهای درون یک لیست باکس ارایه نمایید؟ منظورم همین تابع را توسط رویداد LOAD فرم فراخوانی نمایید
ممنون.

مهرداد صفا
سه شنبه 27 تیر 1391, 02:23 صبح
دوست عزیز صمیمانه از کدی که گذاشتی ممنون و سپاسگذارم. این کد در مواقعی که یک کلاس حاوی روتین New باشه جواب می ده اما در کلاسی مثل Cursors جوابگو نیست.:گریه:






با سلام
برای کلاس هایی که Constructor یا همون متود new را ندارند و حتی تقریبا تمام اعضای یک assembly میتوان
1- با استفاده از نام فایل و متودهای Load از کلاس System.Reflection.Assembly یا یک type از یک شی در assembly مورد نظر و متود GetAssembly یک شی از این کلاس ساخته.
2- با استفاده از متود GetTypes به تمام اعضای assembly دسترسی داشت و هر دسته از اعضا از جمله متود ها و خصوصیات آن را گرفت.



برای گرفتن خصوصیات کلاس Cursors:


'in the name of god
' صل الله علی محمد و آله
Public Class Form1
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim counter As Integer
Dim SystemDotWindowsDotFormsDotDLL As System.Reflection.Assembly = System.Reflection.Assembly.GetAssembly(System.Wind ows.Forms.Cursors.Default.GetType())
MsgBox(SystemDotWindowsDotFormsDotDLL.FullName)
For Each Cursor As System.Reflection.PropertyInfo In SystemDotWindowsDotFormsDotDLL.GetType("System.Windows.Forms.Cursors").GetProperties
'TextBox1.Text += Cursor.ToString() + vbNewLine
'یا
TextBox1.Text += Cursor.Name + vbNewLine
counter += 1
Next
End Sub
End Class

MehdiAhmadi
سه شنبه 27 تیر 1391, 08:53 صبح
دوست عزیز سلام.
صمیمانه از کدی که گذاشتید ممنون. منظور بنده دقیقا همین کد بود. فقط یک سوال دیگه! چطور می تونم توسط برنامه مجموعه این نام ها را بخوانم و در یک لیست باکس قرار بدم بعد با تغییر ایندکس کاربر آیکن فرم عوض شه؟

Imports System.Reflection
Public Class Form1
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim T As Assembly = Assembly.GetAssembly(System.Windows.Forms.Cursors. Default.GetType())
For Each Cursor As PropertyInfo In T.GetType("System.Windows.Forms.Cursors").GetProperties

ListBox1.Items.Add(Cursor.Name)
Next
End Sub
با سپاس فراوان

مهرداد صفا
سه شنبه 27 تیر 1391, 22:27 عصر
چطور می تونم توسط برنامه مجموعه این نام ها را بخوانم و در یک لیست باکس قرار بدم بعد با تغییر ایندکس کاربر آیکن فرم عوض شه؟

با سلام
متود PropertyInfo.GetValue مقدار خصوصیت مورد نظر را به صورت یک شی بر میگرداند. کد نهایی متواند اینگونه باشد.




'in the name of god
Imports System.Reflection
PublicClass Form1
PrivateSub Form1_Load(ByVal sender AsObject, ByVal e As System.EventArgs) HandlesMe.Load
Dim T As Assembly = Assembly.GetAssembly(System.Windows.Forms.Cursors. Default.GetType())
ForEach Cursor As PropertyInfo In T.GetType("System.Windows.Forms.Cursors").GetProperties
ListBox1.Items.Add(Cursor.Name)
Next
EndSub


PrivateSub ListBox1_SelectedIndexChanged(ByVal sender AsObject, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
Dim T As Assembly = Assembly.GetAssembly(System.Windows.Forms.Cursors. Default.GetType())
Dim SelectedCursor As System.Windows.Forms.Cursor = T.GetType("System.Windows.Forms.Cursors").GetProperties()(ListBox1.SelectedIndex).GetValue (Nothing, Nothing)
Me.Cursor = SelectedCursor
EndSub
EndClass

MehdiAhmadi
چهارشنبه 28 تیر 1391, 08:20 صبح
سلام دوست عزیز
ممنون از کدی که گذاشتید. من جواب سوالمو با این کدی که نوشتید گرفتم. صمیمانه از وقتی که گذاشتید ممنون