The Labs \ Source Viewer \ SSCLI \ System \ __Filters

  1. // ==++==
  2. //
  3. //
  4. // Copyright (c) 2006 Microsoft Corporation. All rights reserved.
  5. //
  6. // The use and distribution terms for this software are contained in the file
  7. // named license.txt, which can be found in the root of this distribution.
  8. // By using this software in any fashion, you are agreeing to be bound by the
  9. // terms of this license.
  10. //
  11. // You must not remove this notice, or any other, from this software.
  12. //
  13. //
  14. // ==--==
  15. // __Filters.cs
  16. //
  17. // This class defines the delegate methods for the COM+ implemented filters.
  18. //
  19. //
  20. //
  21. namespace System
  22. {
  23.     using System;
  24.     using System.Reflection;
  25.     using System.Globalization;
  26.     [Serializable()]
  27.     internal class __Filters
  28.     {
  29.        
  30.         // Filters...
  31.         // The following are the built in filters defined for this class. These
  32.         // should really be defined as static methods. They are used in as delegates
  33.         // which currently doesn't support static methods. We will change this
  34.         // once the compiler supports delegates.
  35.        
  36.         // FilterAttribute
  37.         // This method will search for a member based upon the attribute passed in.
  38.         // filterCriteria -- an Int32 representing the attribute
  39.         internal virtual bool FilterAttribute(MemberInfo m, object filterCriteria)
  40.         {
  41.             // Check that the criteria object is an Integer object
  42.             if (filterCriteria == null)
  43.                 throw new InvalidFilterCriteriaException(Environment.GetResourceString("RFLCT.FltCritInt"));
  44.            
  45.             switch (m.MemberType) {
  46.                 case MemberTypes.Constructor:
  47.                 case MemberTypes.Method:
  48.                    
  49.                     {
  50.                        
  51.                         MethodAttributes criteria = 0;
  52.                         try {
  53.                             int i = (int)filterCriteria;
  54.                             criteria = (MethodAttributes)i;
  55.                         }
  56.                         catch {
  57.                             throw new InvalidFilterCriteriaException(Environment.GetResourceString("RFLCT.FltCritInt"));
  58.                         }
  59.                        
  60.                        
  61.                         MethodAttributes attr;
  62.                         if (m.MemberType == MemberTypes.Method)
  63.                             attr = ((MethodInfo)m).Attributes;
  64.                         else
  65.                             attr = ((ConstructorInfo)m).Attributes;
  66.                        
  67.                         if (((criteria & MethodAttributes.MemberAccessMask) != 0) && (attr & MethodAttributes.MemberAccessMask) != (criteria & MethodAttributes.MemberAccessMask))
  68.                             return false;
  69.                         if (((criteria & MethodAttributes.Static) != 0) && (attr & MethodAttributes.Static) == 0)
  70.                             return false;
  71.                         if (((criteria & MethodAttributes.Final) != 0) && (attr & MethodAttributes.Final) == 0)
  72.                             return false;
  73.                         if (((criteria & MethodAttributes.Virtual) != 0) && (attr & MethodAttributes.Virtual) == 0)
  74.                             return false;
  75.                         if (((criteria & MethodAttributes.Abstract) != 0) && (attr & MethodAttributes.Abstract) == 0)
  76.                             return false;
  77.                         if (((criteria & MethodAttributes.SpecialName) != 0) && (attr & MethodAttributes.SpecialName) == 0)
  78.                             return false;
  79.                         return true;
  80.                     }
  81.                     break;
  82.                 case MemberTypes.Field:
  83.                    
  84.                     {
  85.                         FieldAttributes criteria = 0;
  86.                         try {
  87.                             int i = (int)filterCriteria;
  88.                             criteria = (FieldAttributes)i;
  89.                         }
  90.                         catch {
  91.                             throw new InvalidFilterCriteriaException(Environment.GetResourceString("RFLCT.FltCritInt"));
  92.                         }
  93.                        
  94.                         FieldAttributes attr = ((FieldInfo)m).Attributes;
  95.                         if (((criteria & FieldAttributes.FieldAccessMask) != 0) && (attr & FieldAttributes.FieldAccessMask) != (criteria & FieldAttributes.FieldAccessMask))
  96.                             return false;
  97.                         if (((criteria & FieldAttributes.Static) != 0) && (attr & FieldAttributes.Static) == 0)
  98.                             return false;
  99.                         if (((criteria & FieldAttributes.InitOnly) != 0) && (attr & FieldAttributes.InitOnly) == 0)
  100.                             return false;
  101.                         if (((criteria & FieldAttributes.Literal) != 0) && (attr & FieldAttributes.Literal) == 0)
  102.                             return false;
  103.                         if (((criteria & FieldAttributes.NotSerialized) != 0) && (attr & FieldAttributes.NotSerialized) == 0)
  104.                             return false;
  105.                         if (((criteria & FieldAttributes.PinvokeImpl) != 0) && (attr & FieldAttributes.PinvokeImpl) == 0)
  106.                             return false;
  107.                         return true;
  108.                     }
  109.                     break;
  110.             }
  111.            
  112.             return false;
  113.         }
  114.         // FilterName
  115.         // This method will filter based upon the name. A partial wildcard
  116.         // at the end of the string is supported.
  117.         // filterCriteria -- This is the string name
  118.         internal virtual bool FilterName(MemberInfo m, object filterCriteria)
  119.         {
  120.             // Check that the criteria object is a String object
  121.             if (filterCriteria == null || !(filterCriteria is string))
  122.                 throw new InvalidFilterCriteriaException(Environment.GetResourceString("RFLCT.FltCritString"));
  123.            
  124.             // At the moment this fails if its done on a single line....
  125.             string str = ((string)filterCriteria);
  126.             str = str.Trim();
  127.            
  128.             string name = m.Name;
  129.             // Get the nested class name only, as opposed to the mangled one
  130.             if (m.MemberType == MemberTypes.NestedType)
  131.                 name = name.Substring(name.LastIndexOf('+') + 1);
  132.             // Check to see if this is a prefix or exact match requirement
  133.             if (str.Length > 0 && str[str.Length - 1] == '*') {
  134.                 str = str.Substring(0, str.Length - 1);
  135.                 return (name.StartsWith(str, StringComparison.Ordinal));
  136.             }
  137.            
  138.             return (name.Equals(str));
  139.         }
  140.        
  141.         // FilterIgnoreCase
  142.         // This delegate will do a name search but does it with the
  143.         // ignore case specified.
  144.         internal virtual bool FilterIgnoreCase(MemberInfo m, object filterCriteria)
  145.         {
  146.             // Check that the criteria object is a String object
  147.             if (filterCriteria == null || !(filterCriteria is string))
  148.                 throw new InvalidFilterCriteriaException(Environment.GetResourceString("RFLCT.FltCritString"));
  149.            
  150.             string str = (string)filterCriteria;
  151.             str = str.Trim();
  152.            
  153.             string name = m.Name;
  154.             // Get the nested class name only, as opposed to the mangled one
  155.             if (m.MemberType == MemberTypes.NestedType)
  156.                 name = name.Substring(name.LastIndexOf('+') + 1);
  157.             // Check to see if this is a prefix or exact match requirement
  158.             if (str.Length > 0 && str[str.Length - 1] == '*') {
  159.                 str = str.Substring(0, str.Length - 1);
  160.                 return (String.Compare(name, 0, str, 0, str.Length, StringComparison.OrdinalIgnoreCase) == 0);
  161.             }
  162.            
  163.             return (String.Compare(str, name, StringComparison.OrdinalIgnoreCase) == 0);
  164.         }
  165.     }
  166. }

Developer Fusion