📄 class.cs
字号:
/// <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 + -