C# 3.0 Cookbook

Recipe 12.4 Finding Members in an Assembly

Problem

You need to find one or more members in an assembly with a specific name or containing part of a name. This partial name could be, for example, any member starting with the letter ' A ' or the string " Test ".

Solution

Use the Type.GetMember method, which returns all members that match a specified criteria:

public static void FindMemberInAssembly(string asmPath, string memberName) { Assembly asm = Assembly.LoadFrom(asmPath); foreach(Type asmType in asm.GetTypes( )) { // check for static ones first MemberInfo[] members = asmType.GetMember(memberName, MemberTypes.All, BindingFlags.Public BindingFlags.NonPublic BindingFlags.Static); if(members.Length == 0) { // check for instance members as well members = asmType.GetMember(memberName, MemberTypes.All, BindingFlags.Public BindingFlags.NonPublic BindingFlags.Instance); } foreach (MemberInfo member in members) { Console.WriteLine("Found " + member.MemberType + ": " + member.ToString( ) + " IN " + member.DeclaringType.FullName); } } }

The memberName argument can contain the wildcard character * to indicate any character or characters . So to find all methods starting with the string "Test", pass the string " Test* " to the memberName parameter. Note that the memberName argument is case-sensitive, but the asmPath argument is not. If you'd like to do a case-insensitive search for members, add the BindingFlags.IgnoreCase flag to the other BindingFlags in the call to Type.GetMember .

Discussion

The GetMember method of the System.Type class is useful for finding one or more methods within a type. This method returns an array of MemberInfo objects that describe any members that match the given parameters.

The * character may be used as a wildcard character only at the end of the name parameter string. In addition, it may be the only character in the name parameter; if this is so, all members are returned. No other wildcard characters, such as ? , are supported.

Once we obtain an array of MemberInfo objects, we need to determine what kind of members they are. To do this, the MemberInfo class contains a MemberType property that returns a System.Reflection.MemberTypes enumeration value. This could be any of the values defined in Table 12-1.

Table 12-1. MemberTypes enumeration values

Enumeration value

Definition

All

All member types

Constructor

A constructor member

Custom

A custom member type

Event

An event member

Field

A field member

Method

A method member

NestedType

A nested type

Property

A property member

TypeInfo

A type member that represents a TypeInfo member

See Also

See Recipe 12.11; see the "Assembly Class," "BindingFlags Enumeration," and "MemberInfo Class" topics in the MSDN documentation.

Категории