PDA

View Full Version : سوال: گرفتن نام یک پراپرتی



Roya Rayane
یک شنبه 31 شهریور 1387, 15:57 عصر
سلام.دوستان می خواستم بدونم که چطور می تونم نام یک پراپرتی رو که توی یک کلاسی تعریف شده رو توی مسیج باکس نشون بدم. ممنون.string name;publict string Name{get{}set{}}

SMRAH1
یک شنبه 31 شهریور 1387, 16:32 عصر
برای این منظور (یافت و شمارش نام prperty ها و متد ها و ... کلاس ها ) باید از فضای نام System.Reflection استفاده کنی.کد زیر قسمتی از برنامه ای است که قبلا نوشتم (البته با کمک مثالهای :خجالت:SAMS):.اگر لازمه بگو کد کاملتری بگذارم.


public void Enumarate()
{
BaseForm.AddToText = String.Format("\r\nFile : {0}\r\n", FileName);

try
{
//FileName : is Address of exe.dll,... of .NET
Assembly asm = Assembly.LoadFrom(FileName);
System.Type[] Types = asm.GetTypes();
foreach (Type T in Types)
{
BaseForm.AddToText = String.Format("\r\n--------------------------\r\nInformation of Class : {0}\r\n", T.FullName);
BaseForm.ShowInLabel = T.FullName;
if (ShowFields)
DisplayFields(T);
if (ShowProperties)
DisplayProperties(T);
if (ShowMethods)
DisplayMethods(T);
BaseForm.AddToText = String.Format("\r\n");
if (bStop)
break;
}
}
catch (Exception ex)
{
BaseForm.AddToText = ex.ToString();
BaseForm.AddToText = String.Format("\r\n");
}

if (bStop)
{
BaseForm.AddToText = String.Format("\r\n STOP!!!\r\n");
}
BaseForm.EndMetaFileViewWork();
}

private void DisplayFields(Type T)
{
BaseForm.AddToText = String.Format("\r\n***** [Display Fields] \r\n");
FieldInfo[] Feilds = T.GetFields(
System.Reflection.BindingFlags.Instance
| BindingFlags.Public | BindingFlags.NonPublic);
foreach (FieldInfo F in Feilds)
{
if (bStop)
break;
BaseForm.AddToText = String.Format("{0}\r\n", F.Name);
}
}

private void DisplayProperties(Type T)
{
BaseForm.AddToText = String.Format("\r\n***** [Display Properties] \r\n");
PropertyInfo[] Properties = T.GetProperties(
System.Reflection.BindingFlags.Instance
| BindingFlags.Public | BindingFlags.NonPublic);
foreach (PropertyInfo P in Properties)
{
if (bStop)
break;
BaseForm.AddToText = String.Format("{0}\r\n", P.Name);
}
}

private void DisplayMethods(Type T)
{
BaseForm.AddToText = String.Format("\r\n***** [Display Methods] \r\n");
MethodInfo[] Methods = T.GetMethods(
System.Reflection.BindingFlags.Instance
| BindingFlags.Public | BindingFlags.NonPublic);
foreach (MethodInfo M in Methods)
{
if (bStop)
break;
BaseForm.AddToText = String.Format("{0}\r\n", M.Name);
}
}

Roya Rayane
سه شنبه 02 مهر 1387, 08:54 صبح
سلام.خیلی ممنون از جوابت.ولی اگه می تونی یک مثال ساده تر و راحتر بزن. ممنون.من یک کلاسی دارم که nتا پراپرتی داره که درست هم نام با فیلد های توی جدولمه. برای ذخیره اطلاعات هم می خوام از Store Proceduer استفاده کنم. حالا قسمتی که من می خوام پارامترها رو پر کنم نمی خوام هم نام پارامتر رو بیارم و هم نام این پراپرتی که با پارامتر هم نام است.ممنون.//command.Parameters.AddWithValue("@name", "Ali");//که بجای Ali پراپرتی با نام Name می باشد.

SMRAH1
سه شنبه 02 مهر 1387, 14:15 عصر
سلام
یک راه ساده معرفی یک متد است که با دریافت نام property اقدام به بازگرداندن مقدار اون که (درون خوده کلاس).در این صورت با افزودن یک property جدید باید این تابع رو بروز کنی.
احتمالا راه دیگری هم هست (فعلا نمی تونم راهنمایی بهتر کنم ولی شاید توی منابع بتونم چیزی پیدا کنم).

SMRAH1
سه شنبه 02 مهر 1387, 16:52 عصر
همونطور که نوشتم بايد از يک متد استفاده کني.من از يک خصوصيت شاخص دار استفاده کردم.


class FirstCls
{
private string strOne = "";
private string strTwo = "";
private string strTree = "";

public string One
{
get { return strOne; }
set { strOne = value; }
}

public string Two
{
get { return strTwo; }
set { strTwo = value; }
}

public string Tree
{
get { return strTree; }
set { strTree = value; }
}

public string this[string name]
{
get
{
string strRet = string.Empty;
switch (name)
{
case "One":
strRet = One;
break;
case "Two":
strRet = Two;
break;
case "Tree":
strRet = Tree;
break;
default:
strRet = string.Empty;
break;
}
return strRet;
}

set
{
switch (name)
{
case "One":
One = value;
break;
case "Two":
Two = value;
break;
case "Tree":
Tree = value;
break;
}
}
}
}

class SecondCls
{
public string this[FirstCls cls, string name]
{
get
{
string strRet = string.Empty;
switch (name)
{
case "One":
strRet = cls.One;
break;
case "Two":
strRet = cls.Two;
break;
case "Tree":
strRet = cls.Tree;
break;
default:
strRet = string.Empty;
break;
}
return strRet;
}

set
{
switch (name)
{
case "One":
cls.One = value;
break;
case "Two":
cls.Two = value;
break;
case "Tree":
cls.Tree = value;
break;
}
}
}
}

class Program
{
static void Main(string[] args)
{
FirstCls Fcls = new FirstCls();
SecondCls Scls = new SecondCls();

Fcls.One = "A";
Fcls.Two = "B";
Fcls.Tree = "C";
Fcls["Two"] = "b";
Fcls["Four"] = "d"; //Four property Not avaiable!!!

Console.WriteLine("First use OneCls class :");
Console.Write(Fcls["One"]);
Console.Write(Fcls["Two"]);
Console.Write(Fcls["Tree"]);
Console.Write(Fcls["Four"]); //Four property Not avaiable!!!

Scls[Fcls, "One"] = "a";

Console.WriteLine("\n\n");
Console.WriteLine("Second use SecondCls class :");
Console.Write(Scls[Fcls, "One"]);
Console.Write(Scls[Fcls, "Two"]);
Console.Write(Scls[Fcls, "Tree"]);
Console.Write(Scls[Fcls, "Four"]); //Four property Not avaiable!!!

Console.WriteLine("\n\n");
Console.ReadLine();
}
}

در اين کلاس FirstCls داراي سه خصوصيت است.در نهايت يک خصوصيت شاخص دار معرفي کردم که با گرفتن نام خصوصيت مقدار اون رو بر مي گردونه.اين کلاس براي مواقعي خوبه که ،دسترسي به Source کلاس اصلي داشته باشي.
کلاس SecondCls هم همون کاري رو مي کنه با اين تفاوت که در خصوصيت شاخص دار خود يک مرجع به يک کلاس FirstCls و يک نام خصوصيت مي گيرد و خصوصيت مربوط به FirstCls رو بر مي گردونه (يا مقدار دهي مي کنه).اين مثال براي مواقعي که به Source منبع کلاس دسترسي نداري خوبه.
استفاده از اين روش دو نکته مهم داره:
1) اول اينکه بايد نوع همه خصوصيت (يا لااقل آنهايي که مي خواهي از اين روش استفاده کني) ،با هم يکي باشند (در اين مثال One و Two و ... string هستند)
2) دوم اينکه با افزودن يک خصوصيت ديگر،بايد خصوصيت ساخص دار را ويرايش کني تا با نام خصوصيت جديد هماهنگ شود

SMRAH1
سه شنبه 02 مهر 1387, 16:54 عصر
یک راه دیگر هم استفاده Reflection است (که قبلا نوشتم).

این کد رو (که دقیقا مطابق با خواسته شما است) در MSDN پیدا کردم:


using System;
using System.Reflection;

// Define a class with a property.
public class TestClass
{
private string caption = "A Default caption";
public string Caption
{
get { return caption; }
set
{
if (caption != value)
{
caption = value;
}
}
}
}

class TestPropertyInfo
{
public static void Main()
{
TestClass t = new TestClass();

// Get the type and PropertyInfo.
Type myType = t.GetType();
PropertyInfo pinfo = myType.GetProperty("Caption");

// Display the property value, using the GetValue method.
Console.WriteLine("\nGetValue: " + pinfo.GetValue(t, null));

// Use the SetValue method to change the caption.
pinfo.SetValue(t, "This caption has been changed.", null);

// Display the caption again.
Console.WriteLine("GetValue: " + pinfo.GetValue(t, null));

Console.WriteLine("\nPress the Enter key to continue.");
Console.ReadLine();
}
}

/*
This example produces the following output:

GetValue: A Default caption
GetValue: This caption has been changed

Press the Enter key to continue.
*/

موفق باشید.