1

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

姓名
    类型: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*");
    

如果仅用*作参数值,您甚至可以获得所有可用成员。

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

4

1 回答 1

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;
    }
}
于 2013-05-30T13:58:51.303 回答