⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 class.cs

📁 C#编译器源代码。Micorsoft开放源代码
💻 CS
📖 第 1 页 / 共 5 页
字号:
		/// <summary>		///   This function is based by a delegate to the FindMembers routine		/// </summary>		static bool AlwaysAccept (MemberInfo m, object filterCriteria)		{			return true;		}		/// <summary>		///   This filter is used by FindMembers, and we just keep		///   a global for the filter to `AlwaysAccept'		/// </summary>		static MemberFilter accepting_filter;				static TypeContainer ()		{			accepting_filter = new MemberFilter (AlwaysAccept);		}		public MethodInfo[] GetMethods ()		{			ArrayList members = new ArrayList ();			DefineMembers (null);			if (methods != null) {				int len = methods.Count;				for (int i = 0; i < len; i++) {					Method m = (Method) methods [i];					members.Add (m.MethodBuilder);				}			}			if (operators != null) {				int len = operators.Count;				for (int i = 0; i < len; i++) {					Operator o = (Operator) operators [i];					members.Add (o.OperatorMethodBuilder);				}			}			if (properties != null) {				int len = properties.Count;				for (int i = 0; i < len; i++) {					Property p = (Property) properties [i];					if (p.GetBuilder != null)						members.Add (p.GetBuilder);					if (p.SetBuilder != null)						members.Add (p.SetBuilder);				}			}							if (indexers != null) {				int len = indexers.Count;				for (int i = 0; i < len; i++) {					Indexer ix = (Indexer) indexers [i];					if (ix.GetBuilder != null)						members.Add (ix.GetBuilder);					if (ix.SetBuilder != null)						members.Add (ix.SetBuilder);				}			}			if (events != null) {				int len = events.Count;				for (int i = 0; i < len; i++) {					Event e = (Event) events [i];					if (e.AddBuilder != null)						members.Add (e.AddBuilder);					if (e.RemoveBuilder != null)						members.Add (e.RemoveBuilder);				}			}			MethodInfo[] retMethods = new MethodInfo [members.Count];			members.CopyTo (retMethods, 0);			return retMethods;		}				// Indicated whether container has StructLayout attribute set Explicit		public virtual bool HasExplicitLayout {			get {				return false;			}		}		public override Type FindNestedType (string name)		{			ArrayList [] lists = { types, enums, delegates, interfaces };			for (int j = 0; j < lists.Length; ++j) {				ArrayList list = lists [j];				if (list == null)					continue;								int len = list.Count;				for (int i = 0; i < len; ++i) {					DeclSpace ds = (DeclSpace) list [i];					if (ds.Basename == name) {						ds.DefineType ();						return ds.TypeBuilder;					}				}			}			return null;		}		private void FindMembers_NestedTypes (int modflags,						      BindingFlags bf, MemberFilter filter, object criteria,						      ref ArrayList members)		{			ArrayList [] lists = { types, enums, delegates, interfaces };			for (int j = 0; j < lists.Length; ++j) {				ArrayList list = lists [j];				if (list == null)					continue;							int len = list.Count;				for (int i = 0; i < len; i++) {					DeclSpace ds = (DeclSpace) list [i];										if ((ds.ModFlags & modflags) == 0)						continue;										TypeBuilder tb = ds.TypeBuilder;					if (tb == null) {						if (!(criteria is string) || ds.Basename.Equals (criteria))							tb = ds.DefineType ();					}										if (tb != null && (filter (tb, criteria) == true)) {						if (members == null)							members = new ArrayList ();												members.Add (tb);					}				}			}		}				/// <summary>		///   This method returns the members of this type just like Type.FindMembers would		///   Only, we need to use this for types which are _being_ defined because MS' 		///   implementation can't take care of that.		/// </summary>		//		// FIXME: return an empty static array instead of null, that cleans up		// some code and is consistent with some coding conventions I just found		// out existed ;-)		//		//		// Notice that in various cases we check if our field is non-null,		// something that would normally mean that there was a bug elsewhere.		//		// The problem happens while we are defining p-invoke methods, as those		// will trigger a FindMembers, but this happens before things are defined		//		// Since the whole process is a no-op, it is fine to check for null here.		//		public override MemberList FindMembers (MemberTypes mt, BindingFlags bf,							MemberFilter filter, object criteria)		{			ArrayList members = null;			int modflags = 0;			if ((bf & BindingFlags.Public) != 0)				modflags |= Modifiers.PUBLIC | Modifiers.PROTECTED |					Modifiers.INTERNAL;			if ((bf & BindingFlags.NonPublic) != 0)				modflags |= Modifiers.PRIVATE;			int static_mask = 0, static_flags = 0;			switch (bf & (BindingFlags.Static | BindingFlags.Instance)) {			case BindingFlags.Static:				static_mask = static_flags = Modifiers.STATIC;				break;			case BindingFlags.Instance:				static_mask = Modifiers.STATIC;				static_flags = 0;				break;			default:				static_mask = static_flags = 0;				break;			}			Timer.StartTimer (TimerType.TcFindMembers);			if (filter == null)				filter = accepting_filter; 			if ((mt & MemberTypes.Field) != 0) {				if (fields != null) {					int len = fields.Count;					for (int i = 0; i < len; i++) {						FieldMember f = (FieldMember) fields [i];												if ((f.ModFlags & modflags) == 0)							continue;						if ((f.ModFlags & static_mask) != static_flags)							continue;						FieldBuilder fb = f.FieldBuilder;						if (fb != null && filter (fb, criteria) == true) {							if (members == null)								members = new ArrayList ();														members.Add (fb);						}					}				}				if (constants != null) {					int len = constants.Count;					for (int i = 0; i < len; i++) {						Const con = (Const) constants [i];												if ((con.ModFlags & modflags) == 0)							continue;						if ((con.ModFlags & static_mask) != static_flags)							continue;						FieldBuilder fb = con.FieldBuilder;						if (fb == null) {							if (con.Define ())								fb = con.FieldBuilder;						}						if (fb != null && filter (fb, criteria) == true) {							if (members == null)								members = new ArrayList ();														members.Add (fb);						}					}				}			}			if ((mt & MemberTypes.Method) != 0) {				if (methods != null) {					int len = methods.Count;					for (int i = 0; i < len; i++) {						Method m = (Method) methods [i];												if ((m.ModFlags & modflags) == 0)							continue;						if ((m.ModFlags & static_mask) != static_flags)							continue;												MethodBuilder mb = m.MethodBuilder;						if (mb != null && filter (mb, criteria) == true) {							if (members == null)								members = new ArrayList ();							                                                        members.Add (mb);						}					}				}				if (operators != null) {					int len = operators.Count;					for (int i = 0; i < len; i++) {						Operator o = (Operator) operators [i];												if ((o.ModFlags & modflags) == 0)							continue;						if ((o.ModFlags & static_mask) != static_flags)							continue;												MethodBuilder ob = o.OperatorMethodBuilder;						if (ob != null && filter (ob, criteria) == true) {							if (members == null)								members = new ArrayList ();														members.Add (ob);						}					}				}				if (properties != null) {					int len = properties.Count;					for (int i = 0; i < len; i++) {						Property p = (Property) properties [i];												if ((p.ModFlags & modflags) == 0)							continue;						if ((p.ModFlags & static_mask) != static_flags)							continue;												MethodBuilder b;						b = p.GetBuilder;						if (b != null && filter (b, criteria) == true) {							if (members == null)								members = new ArrayList ();														members.Add (b);						}						b = p.SetBuilder;						if (b != null && filter (b, criteria) == true) {							if (members == null)								members = new ArrayList ();														members.Add (b);						}					}				}								if (indexers != null) {					int len = indexers.Count;					for (int i = 0; i < len; i++) {						Indexer ix = (Indexer) indexers [i];												if ((ix.ModFlags & modflags) == 0)							continue;						if ((ix.ModFlags & static_mask) != static_flags)							continue;												MethodBuilder b;						b = ix.GetBuilder;						if (b != null && filter (b, criteria) == true) {							if (members == null)								members = new ArrayList ();														members.Add (b);						}						b = ix.SetBuilder;						if (b != null && filter (b, criteria) == true) {							if (members == null)								members = new ArrayList ();														members.Add (b);						}					}				}			}			if ((mt & MemberTypes.Event) != 0) {				if (events != null) {					int len = events.Count;					for (int i = 0; i < len; i++) {						Event e = (Event) events [i];												if ((e.ModFlags & modflags) == 0)							continue;						if ((e.ModFlags & static_mask) != static_flags)							continue;						MemberInfo eb = e.EventBuilder;						if (eb != null && filter (eb, criteria) == true) {							if (members == null)								members = new ArrayList ();													        members.Add (e.EventBuilder);						}					}				}			}						if ((mt & MemberTypes.Property) != 0){				if (properties != null) {					int len = properties.Count;					for (int i = 0; i < len; i++) {						Property p = (Property) properties [i];												if ((p.ModFlags & modflags) == 0)							continue;						if ((p.ModFlags & static_mask) != static_flags)							continue;						MemberInfo pb = p.PropertyBuilder;						if (pb != null && filter (pb, criteria) == true) {							if (members == null)								members = new ArrayList ();														members.Add (p.PropertyBuilder);						}					}				}				if (indexers != null) {					int len = indexers.Count;					for (int i = 0; i < len; i++) {						Indexer ix = (Indexer) indexers [i];												if ((ix.ModFlags & modflags) == 0)							continue;						if ((ix.ModFlags & static_mask) != static_flags)							continue;						MemberInfo ib = ix.PropertyBuilder;						if (ib != null && filter (ib, criteria) == true) {							if (members == null)								members = new ArrayList ();														members.Add (ix.PropertyBuilder);						}					}				}			}						if ((mt & MemberTypes.NestedType) != 0)				FindMembers_NestedTypes (modflags, bf, filter, criteria, ref members);			if ((mt & MemberTypes.Constructor) != 0){				if (((bf & BindingFlags.Instance) != 0) && (instance_constructors != null)){					int len = instance_constructors.Count;					for (int i = 0; i < len; i++) {						Constructor c = (Constructor) instance_constructors [i];												ConstructorBuilder cb = c.ConstructorBuilder;						if (cb != null && filter (cb, criteria) == true) {							if (members == null)								members = new ArrayList ();														members.Add (cb);						}					}				}				if (((bf & BindingFlags.Static) != 0) && (default_static_constructor != null)){					ConstructorBuilder cb =						default_static_constructor.ConstructorBuilder;										if (cb != null && filter (cb, criteria) == true) {						if (members == null)							members = new ArrayList ();												members.Add (cb);					}				}			}			//			// Lookup members in base if requested.			//			if ((bf & BindingFlags.DeclaredOnly) == 0) {				if (TypeBuilder.BaseType != null) {					MemberList list = FindMembers (TypeBuilder.BaseType, mt, bf, filter, criteria);					if (list.Count > 0) {						if (members == null)							members = new ArrayList ();											members.AddRange (list);					}				}				if (ifaces != null) {					foreach (Type base_type in ifaces) {						MemberList list = TypeContainer.FindMembers (base_type, mt, bf, filter, criteria);						if (list.Count > 0) {							if (members == null)								members = new ArrayList ();							members.AddRange (list);						}					}				}			}			Timer.StopTimer (TimerType.TcFindMembers);			if (members == null)				return MemberList.Empty;			else				return new MemberList (members);		}		public override MemberCache MemberCache {			get {				return member_cache;			}		}		public static MemberList FindMembers (Type t, MemberTypes mt, BindingFlags bf,						      MemberFilter filter, object criteria)		{			DeclSpace ds = TypeManager.LookupDeclSpace (t);			if (ds != null)				return ds.FindMembers (mt, bf, filter, criteria);			else				return new MemberList (t.FindMembers (mt, bf, filter, criteria));                                        }		//		// FindMethods will look for methods not only in the type `t', but in		// any interfaces implemented by the type.		//		public static MethodInfo [] FindMethods (Type t, BindingFlags bf,							 MemberFilter filter, object criteria)		{			return null;		}		/// <summary>		///   Emits the values for the constants		/// </summary>		public void EmitConstants ()		{			if (constants != null)				foreach (Const con in constants)					con.Emit ();			return;		}		void CheckMemberUsage (MemberCoreArrayList al, string member_type)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -