الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيفية الحصول على اسم الــ Chiled Class من Static Method في الـ Parent Class

بدأه MohamedAliSalim في 9 فبراير 2014 · 5 رد · 749 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

public class BaseManager

{

public static string GetClassName()

{

return MethodBase.GetCurrentMethod().DeclaringType.Name;

}

}

public class ChiledManager

{

}

------------------------------------------------------------------------------

public Form1()

{

InitializeComponent();

}

private void button1_Click(object sender, EventArgs e)

{

string x = ChiledManager.GetClassName(); // Out put = ChiledManager

}

هذا ما أريده

Mohamed Ali Salim

0.1..0...4....7.....6......2.......7........4.........8

#2

بما ان الـ class انت تعرف أنها موجوده يمكنك جعل الدالة GetClassName ذات محتوى صريح كالتالي:

public static string  GetClassName()
{
	return "ChiledManager";
}

إذا لم ترد هذه الطريقة فستحتاج لوسيلة لمعرفة هذه الـ class من غيرها لأنها موجوده فى الـ main namespace و قد يكون معها العديد من الفئات الاخرى. أحد هذه الطرق هو ان تقوم بالتصريح عن interface فارغه و تقوم بتضمينها داخل الفئه ChiledManager و بذلك تستطيع الحصول عليها بإستخدام الـ reflection بكل سهولة:

using System;
using System.Reflection;

public interface IMarker { }

public class ChiledManager : IMarker { }

public class BaseManager
{
    public static string GetClassName()
    {
        Module[] mods = Assembly.GetExecutingAssembly().GetModules(false);

        Type baseType = typeof(IMarker);

        foreach (Module m in mods)
        {
            foreach (Type t in m.GetTypes())
            {
                if (t.IsClass && baseType.IsAssignableFrom(t)) return t.Name;
            }
        }

        return string.Empty;
    }
}

public class Entrypoint
{
    public static void Main()
    {
        Console.WriteLine(BaseManager.GetClassName());
    }
}

و الله ولي التوفيق

مدونتي: C++ Tips and Tricks

#3

أولا ً شكراً على ردك على موضوعي

ثانياً كلامك جميل ولكن الجملة الإخيرة هي صميم الموضوع

انت كاتب

Console.WriteLine(BaseManager.GetClassName());

وانا عاوز اكتب

Console.WriteLine(ChiledManager.GetClassName());

وأحصل على النتيجة "ChiledManager"

 

طبعا ً ال ChiledManager  مش هاشوف فيها الميثود دي علشان مش Inherted منها

Mohamed Ali Salim

0.1..0...4....7.....6......2.......7........4.........8

#4

الدالة GetClassName غير موجوده فى الـ ChiledManager فكيف تريد إستدعائها منه؟

 

أرجو ان تضع مثال يشرح ما تريد أو تفصل أكثر ما تريد

 

 

و الله ولي التوفيق

تم تعديل هذه المشاركة بواسطة C++er في 12 فبراير 2014 في 18:07

مدونتي: C++ Tips and Tricks

#5

المثال كما ذكرت انا من قبل

انا اريد الحصول على اسم الــ Child Class من خلال Static Method موجودة في الــ Parent Class

بمعنى تاني

انا عاوز من اعرف الميثود اللي موجودة في الكلاس الاب تم استدعائه من انهي كلاس ابن لأنه يوجد اكثر من أبن لهذا الأب فأريد ان اعرف انهي أبن استخدم هذه الميثود

Mohamed Ali Salim

0.1..0...4....7.....6......2.......7........4.........8

#6

لا يمكن الحصول على instance من خلال static method

استخدم هذا الكود

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Reflection;
namespace Examples
{
    class Parent
    {
       
        public  string ClassName
        {
          get { return this.GetType().Name; }
        }
   
    }
    class ChildA : Parent
    { 
    
    
    }
    class ChildB : Parent
    {


    }
    class Program
    {
        static void Main(string[] args)
        {
       var objB = new ChildB();
        Console.WriteLine(objB.ClassName);

     var objA=new ChildA();
            Console.WriteLine(objA.ClassName);
            Console.ReadLine();  
         }
       
        }
    }

لاحظ انه باستدعاء Static method  لمعرفة جميع الابناء بدون instance.....

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Reflection;
namespace ConsoleApplication1
{
    class Parent
    { 
    
    public static IEnumerable<Type> GatName()
    {
       return Assembly.GetAssembly(typeof(Parent)).GetTypes().Where(t => t.IsSubclassOf(typeof(Parent)));
       
    }
            
    }
    class ChildA : Parent
    { 
    
    
    }
    class ChildB : Parent
    {


    }
    class Program
    {
        static void Main(string[] args)
        {
            foreach (Type t in ChildA.GatName())  Console.WriteLine(t.FullName);
            Console.ReadLine();  
         }
       
        }
    }

VB.NET and C# Comparison

http://www.harding.edu/fmccown/vbnet_csharp_comparison.html

002.gif

=-=-=-=-=-=-=
ذو العلم يشقى فى النعيم بعلمه .:. واخو الجهالة فى الشقاوة ينعم
=-=-=-=-=-=-=
يا من بدنياه اشتغل . قد غره طول الأمل . فالموت يأتى بغتة . والقبر صندوق العمل
=-=-=-=-=-=-=
ان لم تستطع ان تجد ما تفعله فافعل ما لم تسطع ان تجده

screen_shot_2011-05-19_at_12.44.49_pm.pn

مواضيع مشابهة