summaryrefslogtreecommitdiff
path: root/src/mscorlib/src/System/__Filters.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/mscorlib/src/System/__Filters.cs')
-rw-r--r--src/mscorlib/src/System/__Filters.cs155
1 files changed, 155 insertions, 0 deletions
diff --git a/src/mscorlib/src/System/__Filters.cs b/src/mscorlib/src/System/__Filters.cs
new file mode 100644
index 0000000000..aabb52d803
--- /dev/null
+++ b/src/mscorlib/src/System/__Filters.cs
@@ -0,0 +1,155 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+//
+// This class defines the delegate methods for the COM+ implemented filters.
+//
+//
+//
+
+namespace System {
+ using System;
+ using System.Reflection;
+ using System.Globalization;
+ [Serializable]
+ internal class __Filters {
+
+ // Filters...
+ // The following are the built in filters defined for this class. These
+ // should really be defined as static methods. They are used in as delegates
+ // which currently doesn't support static methods. We will change this
+ // once the compiler supports delegates.
+ //
+ // Note that it is not possible to make this class static as suggested by
+ // the above comment anymore because of it got marked serializable.
+
+ internal static readonly __Filters Instance = new __Filters();
+
+ // FilterAttribute
+ // This method will search for a member based upon the attribute passed in.
+ // filterCriteria -- an Int32 representing the attribute
+ internal virtual bool FilterAttribute(MemberInfo m,Object filterCriteria)
+ {
+ // Check that the criteria object is an Integer object
+ if (filterCriteria == null)
+ throw new InvalidFilterCriteriaException(Environment.GetResourceString("RFLCT.FltCritInt"));
+
+ switch (m.MemberType)
+ {
+ case MemberTypes.Constructor:
+ case MemberTypes.Method: {
+
+ MethodAttributes criteria = 0;
+ try {
+ int i = (int) filterCriteria;
+ criteria = (MethodAttributes) i;
+ }
+ catch {
+ throw new InvalidFilterCriteriaException(Environment.GetResourceString("RFLCT.FltCritInt"));
+ }
+
+
+ MethodAttributes attr;
+ if (m.MemberType == MemberTypes.Method)
+ attr = ((MethodInfo) m).Attributes;
+ else
+ attr = ((ConstructorInfo) m).Attributes;
+
+ if (((criteria & MethodAttributes.MemberAccessMask) != 0) && (attr & MethodAttributes.MemberAccessMask) != (criteria & MethodAttributes.MemberAccessMask))
+ return false;
+ if (((criteria & MethodAttributes.Static) != 0) && (attr & MethodAttributes.Static) == 0)
+ return false;
+ if (((criteria & MethodAttributes.Final) != 0) && (attr & MethodAttributes.Final) == 0)
+ return false;
+ if (((criteria & MethodAttributes.Virtual) != 0) && (attr & MethodAttributes.Virtual) == 0)
+ return false;
+ if (((criteria & MethodAttributes.Abstract) != 0) && (attr & MethodAttributes.Abstract) == 0)
+ return false;
+ if (((criteria & MethodAttributes.SpecialName) != 0) && (attr & MethodAttributes.SpecialName) == 0)
+ return false;
+ return true;
+ }
+ case MemberTypes.Field:
+ {
+ FieldAttributes criteria = 0;
+ try {
+ int i = (int) filterCriteria;
+ criteria = (FieldAttributes) i;
+ }
+ catch {
+ throw new InvalidFilterCriteriaException(Environment.GetResourceString("RFLCT.FltCritInt"));
+ }
+
+ FieldAttributes attr = ((FieldInfo) m).Attributes;
+ if (((criteria & FieldAttributes.FieldAccessMask) != 0) && (attr & FieldAttributes.FieldAccessMask) != (criteria & FieldAttributes.FieldAccessMask))
+ return false;
+ if (((criteria & FieldAttributes.Static) != 0) && (attr & FieldAttributes.Static) == 0)
+ return false;
+ if (((criteria & FieldAttributes.InitOnly) != 0) && (attr & FieldAttributes.InitOnly) == 0)
+ return false;
+ if (((criteria & FieldAttributes.Literal) != 0) && (attr & FieldAttributes.Literal) == 0)
+ return false;
+ if (((criteria & FieldAttributes.NotSerialized) != 0) && (attr & FieldAttributes.NotSerialized) == 0)
+ return false;
+ if (((criteria & FieldAttributes.PinvokeImpl) != 0) && (attr & FieldAttributes.PinvokeImpl) == 0)
+ return false;
+ return true;
+ }
+ }
+
+ return false;
+ }
+ // FilterName
+ // This method will filter based upon the name. A partial wildcard
+ // at the end of the string is supported.
+ // filterCriteria -- This is the string name
+ internal virtual bool FilterName(MemberInfo m,Object filterCriteria)
+ {
+ // Check that the criteria object is a String object
+ if(filterCriteria == null || !(filterCriteria is String))
+ throw new InvalidFilterCriteriaException(Environment.GetResourceString("RFLCT.FltCritString"));
+
+ // At the moment this fails if its done on a single line....
+ String str = ((String) filterCriteria);
+ str = str.Trim();
+
+ String name = m.Name;
+ // Get the nested class name only, as opposed to the mangled one
+ if (m.MemberType == MemberTypes.NestedType)
+ name = name.Substring(name.LastIndexOf('+') + 1);
+ // Check to see if this is a prefix or exact match requirement
+ if (str.Length > 0 && str[str.Length - 1] == '*') {
+ str = str.Substring(0, str.Length - 1);
+ return (name.StartsWith(str, StringComparison.Ordinal));
+ }
+
+ return (name.Equals(str));
+ }
+
+ // FilterIgnoreCase
+ // This delegate will do a name search but does it with the
+ // ignore case specified.
+ internal virtual bool FilterIgnoreCase(MemberInfo m,Object filterCriteria)
+ {
+ // Check that the criteria object is a String object
+ if(filterCriteria == null || !(filterCriteria is String))
+ throw new InvalidFilterCriteriaException(Environment.GetResourceString("RFLCT.FltCritString"));
+
+ String str = (String) filterCriteria;
+ str = str.Trim();
+
+ String name = m.Name;
+ // Get the nested class name only, as opposed to the mangled one
+ if (m.MemberType == MemberTypes.NestedType)
+ name = name.Substring(name.LastIndexOf('+') + 1);
+ // Check to see if this is a prefix or exact match requirement
+ if (str.Length > 0 && str[str.Length - 1] == '*') {
+ str = str.Substring(0, str.Length - 1);
+ return (String.Compare(name,0,str,0,str.Length,StringComparison.OrdinalIgnoreCase)==0);
+ }
+
+ return (String.Compare(str,name, StringComparison.OrdinalIgnoreCase) == 0);
+ }
+ }
+}