使用Type.GetMember方法的name参数进行搜索

时间:2013-05-30 13:51:07

标签: c# syntax parameters wildcard system.reflection

我目前知道Type.GetMember Method的所有方法重载的第一个参数:

  
name
类型:System.String
  包含公共名称的字符串   成员得到。

区分大小写,允许通过匹配进行搜索:

  1. 完全成员名称

    Type myType = myString.GetType();
    // Get the members for myString which are named Compare.
    MemberInfo[] myMembers = myType.GetMember("Compare");
    
  2. 使用*通配符

    开始所有具有给定值的成员名称
    Type myType = myString.GetType();
    // Get the members for myString starting with the letter C.
    MemberInfo[] myMembers = myType.GetMember("C*");
    // Get the members for myString starting with the string Comp.
    myMembers = myType.GetMember("Comp*");
    
  3. 如果仅使用*作为参数值,您甚至可以获得所有可用的成员。

    我的问题是:除了上述两种方法之外,是否可以使用其他类型的字符串模式来匹配成员(例如C*eCompar??)

1 个答案:

答案 0 :(得分:2)

不,.NET Framework代码不包含任何其他通配符的处理。

System.RuntimeType.FilterHelper内部使用的GetMember代码:

// System.RuntimeType
private static void FilterHelper(BindingFlags bindingFlags, ref string name, bool allowPrefixLookup, out bool prefixLookup, out bool ignoreCase, out RuntimeType.MemberListType listType)
{
    prefixLookup = false;
    ignoreCase = false;
    if (name != null)
    {
        if ((bindingFlags & BindingFlags.IgnoreCase) != BindingFlags.Default)
        {
            name = name.ToLower(CultureInfo.InvariantCulture);
            ignoreCase = true;
            listType = RuntimeType.MemberListType.CaseInsensitive;
        }
        else
        {
            listType = RuntimeType.MemberListType.CaseSensitive;
        }
        if (allowPrefixLookup && name.EndsWith("*", StringComparison.Ordinal))
        {
            name = name.Substring(0, name.Length - 1);
            prefixLookup = true;
            listType = RuntimeType.MemberListType.All;
            return;
        }
    }
    else
    {
        listType = RuntimeType.MemberListType.All;
    }
}