[C#.NET][VB.NET] 如何 列舉 類別中的成員 / Type.GetMembers

[C#.NET][VB.NET] 如何 列舉 類別中的成員

1.Type 類別,可以提供我們類別中的型別定義,C# 的 typeof 運算子、C++ 的 typeid 運算子與 Visual Basic 的 GetType 運算子,都可取得型別的 Type 物件。以下提供了三個簡單取得類型的方法。

//取得類別型別
//法一
Type myType = Type.GetType(myTypeName);
//法二
myType = typeof(System.Windows.Forms.Button);
//法三
System.Windows.Forms.TreeView MyTreeView = new TreeView();
Type myType = MyTreeView.GetType();


2009-8-12 下午 11-39-27

Assembly 類別Module 類別 可以讓我們取得相關物件的型別資訊,利用這兩個類別也可以撈到其他的東西,下篇再來討論。

2009-8-12 下午 11-50-08

2.MemberInfo 類別 提供我們取得類別的成員資訊

2009-8-11 下午 09-38-33

3.觀察使用 GetMembers 方法取得類別的成員們

2009-8-12 下午 11-26-05

4.MemberTypes 列舉型別可以判斷成員們的屬性

2009-8-13 上午 12-26-52

5.FindMembers 方法也可以找出型別中的成員

2009-8-13 上午 12-33-28

以下範例需要匯入

System.Reflection 命名空間

如何列舉類別中所有的成員

法一:

//1.取得類別型別
//法一
Type myType = Type.GetType(myTypeName);
//法二
myType = typeof(System.Windows.Forms.Button);
string myInfo = myType.ToString() + " 成員包括:" + System.Environment.NewLine;
if (myType != null)
{
    try
    {
        //2.取得所有成員資訊
        MemberInfo[] MemberInfos = myType.GetMembers();
        //Assembly myAssembly = myType.Assembly;
        //Module ModuleInfos = myType.Module;
        //3.列舉所有成員資訊
        foreach (MemberInfo myMemberInfo in MemberInfos)
        {
            switch (myMemberInfo.MemberType)
            {
                case MemberTypes.All:
                    myInfo += "All " + "\t";
                    break;
                case MemberTypes.Constructor:
                    myInfo += "Constructor " + "\t";//建構函數
                    break;
                case MemberTypes.Custom:
                    myInfo += "Custom " + "\t";//自訂
                    break;
                case MemberTypes.Event:
                    myInfo += "Event " + "\t";
                    break;
                case MemberTypes.Field:
                    myInfo += "Field " + "\t";
                    break;
                case MemberTypes.Method:
                    myInfo += "Method " + "\t";
                    break;
                case MemberTypes.NestedType:
                    myInfo += "NestedType " + "\t";
                    break;
                case MemberTypes.Property:
                    myInfo += "Property " + "\t";
                    break;
                case MemberTypes.TypeInfo:
                    myInfo += "TypeInfo " + "\t";
                    break;
            }
            myInfo += ":" + myMemberInfo.ToString() + System.Environment.NewLine;
        }
        myInfo += myType.ToString() + " 的命名空間為:" + System.Environment.NewLine;
        myInfo += myType.Namespace + System.Environment.NewLine;
        myInfo += myType.Module + System.Environment.NewLine;
        textBox2.Text = myInfo;
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
    }
}
Type myType = typeof(System.Threading.Thread);
string myInfo = myType.FullName + " 成員包括:" + System.Environment.NewLine;
//2.列舉所有成員
foreach (MemberInfo mi in myType.GetMembers())
{
    myInfo += String.Format("{0} : {1}\n", mi.MemberType, mi) + System.Environment.NewLine;
}
textBox2.Text = myInfo;
2009-8-13 上午 12-47-44 

如何列舉類別中的事件成員

string myInfo = myTypeName + "的公共事件包括:" + System.Environment.NewLine;
//1.類別實體化
System.Windows.Forms.TreeView MyTreeView = new TreeView();
//2.取得類別的型別
Type myType = MyTreeView.GetType();
if (myType != null)
{
    try
    {
        //3.取得型別的事件成員
        MemberInfo[] MyMemberInfos = myType.FindMembers(MemberTypes.Event, BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance, null, null);
        for (int i = 0; i < MyMemberInfos.Length; i++)
        {
            myInfo += MyMemberInfos[i].ToString() + System.Environment.NewLine;
        }
        textBox2.Text = myInfo;
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
    }
}

範例下載:

VB_EnumClassMember.rar

CS_EnumClassMember.rar

若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET

Image result for microsoft+mvp+logo