// // System.Type.cs // // Author: // Miguel de Icaza (miguel@ximian.com) // // (C) Ximian, Inc. http://www.ximian.com // // TODO: Mucho left to implement. // using System.Reflection; using System.Collections; using System.Runtime.CompilerServices; using System.Globalization; namespace System { // // FIXME: Implement the various IReflect dependencies // [MonoTODO] [Serializable] public abstract class Type : MemberInfo, IReflect { internal RuntimeTypeHandle _impl; public static readonly char Delimiter = '.'; public static readonly Type[] EmptyTypes = {}; public static readonly MemberFilter FilterAttribute = new MemberFilter (FilterAttribute_impl); public static readonly MemberFilter FilterName = new MemberFilter (FilterName_impl); public static readonly MemberFilter FilterNameIgnoreCase = new MemberFilter (FilterNameIgnoreCase_impl); public static readonly object Missing; /* implementation of the delegates for MemberFilter */ static bool FilterName_impl (MemberInfo m, object filterCriteria) { string name = (string) filterCriteria; return name.Equals (m.Name); } static bool FilterNameIgnoreCase_impl (MemberInfo m, object filterCriteria) { string name = (string) filterCriteria; return String.Compare (name, m.Name, true) == 0; } [MonoTODO] static bool FilterAttribute_impl (MemberInfo m, object filterCriteria) { throw new NotImplementedException ("FilterAttribute_impl"); } protected Type () { } /// /// The assembly where the type is defined. /// public abstract Assembly Assembly { get; } /// /// Gets the fully qualified name for the type including the /// assembly name where the type is defined. /// public abstract string AssemblyQualifiedName { get; } /// /// Returns the Attributes associated with the type. /// public TypeAttributes Attributes { get { return GetAttributeFlagsImpl (); } } /// /// Returns the basetype for this type /// public abstract Type BaseType { get; } /// /// Returns the class that declares the member. /// [MonoTODO] public override Type DeclaringType { get { throw new NotImplementedException (); } } /// /// /// [MonoTODO] public static Binder DefaultBinder { get { throw new NotImplementedException (); } } /// /// The full name of the type including its namespace /// public abstract string FullName { get; } public abstract Guid GUID { get; } [MonoTODO] public bool HasElementType { get {return false;} // FIXME } public bool IsAbstract { get { return (Attributes & TypeAttributes.Abstract) != 0; } } public bool IsAnsiClass { get { return (Attributes & TypeAttributes.StringFormatMask) == TypeAttributes.AnsiClass; } } public bool IsArray { get { return IsArrayImpl (); } } public bool IsAutoClass { get { return (Attributes & TypeAttributes.StringFormatMask) == TypeAttributes.AutoClass; } } public bool IsAutoLayout { get { return (Attributes & TypeAttributes.LayoutMask) == TypeAttributes.AutoLayout; } } public bool IsByRef { get { return IsByRefImpl (); } } public bool IsClass { get { if (this == typeof (System.Enum) || this == typeof (System.ValueType)) return true; if (IsInterface) return false; return !type_is_subtype_of (this, typeof (System.ValueType), false); } } public bool IsCOMObject { get { return IsCOMObjectImpl (); } } public bool IsContextful { get { return IsContextfulImpl (); } } public bool IsEnum { get { return type_is_subtype_of (this, typeof (System.Enum), false) && this != typeof (System.Enum); } } public bool IsExplicitLayout { get { return (Attributes & TypeAttributes.LayoutMask) == TypeAttributes.ExplicitLayout; } } public bool IsImport { get { return (Attributes & TypeAttributes.Import) != 0; } } public bool IsInterface { get { return (Attributes & TypeAttributes.ClassSemanticsMask) == TypeAttributes.Interface; } } public bool IsLayoutSequential { get { return (Attributes & TypeAttributes.LayoutMask) == TypeAttributes.SequentialLayout; } } public bool IsMarshalByRef { get { return IsMarshalByRefImpl (); } } public bool IsNestedAssembly { get { return (Attributes & TypeAttributes.VisibilityMask) == TypeAttributes.NestedAssembly; } } public bool IsNestedFamANDAssem { get { return (Attributes & TypeAttributes.VisibilityMask) == TypeAttributes.NestedFamANDAssem; } } public bool IsNestedFamily { get { return (Attributes & TypeAttributes.VisibilityMask) == TypeAttributes.NestedFamily; } } public bool IsNestedFamORAssem { get { return (Attributes & TypeAttributes.VisibilityMask) == TypeAttributes.NestedFamORAssem; } } public bool IsNestedPrivate { get { return (Attributes & TypeAttributes.VisibilityMask) == TypeAttributes.NestedPrivate; } } public bool IsNestedPublic { get { return (Attributes & TypeAttributes.VisibilityMask) == TypeAttributes.NestedPublic; } } public bool IsNotPublic { get { return !IsPublic; } } public bool IsPointer { get { return IsPointerImpl (); } } public bool IsPrimitive { get { return IsPrimitiveImpl (); } } [MonoTODO] public bool IsPublic { get { // FIXME: handle nestedpublic, too? return (Attributes & TypeAttributes.VisibilityMask) == TypeAttributes.Public; } } public bool IsSealed { get { return (Attributes & TypeAttributes.Sealed) != 0; } } public bool IsSerializable { get { return (Attributes & TypeAttributes.Serializable) != 0; } } public bool IsSpecialName { get { return (Attributes & TypeAttributes.SpecialName) != 0; } } public bool IsUnicodeClass { get { return (Attributes & TypeAttributes.StringFormatMask) == TypeAttributes.UnicodeClass; } } public bool IsValueType { get { return IsValueTypeImpl (); } } [MonoTODO] public override MemberTypes MemberType { get {return MemberTypes.TypeInfo;} // FIXME } public abstract Module Module {get;} public abstract string Namespace {get;} [MonoTODO] public override Type ReflectedType { get { throw new NotImplementedException (); } } public abstract RuntimeTypeHandle TypeHandle {get;} [MonoTODO] public ConstructorInfo TypeInitializer { get { throw new NotImplementedException (); } } public abstract Type UnderlyingSystemType {get;} public override bool Equals (object o) { if (o == null) return false; Type cmp = o as Type; if (cmp == null) return false; return Equals (cmp); } [MethodImplAttribute(MethodImplOptions.InternalCall)] public extern bool Equals (Type type); [MethodImplAttribute(MethodImplOptions.InternalCall)] private static extern Type internal_from_handle (RuntimeTypeHandle handle); [MethodImplAttribute(MethodImplOptions.InternalCall)] private static extern Type internal_from_name (string name); public static Type GetType(string typeName) { return internal_from_name (typeName); } public static Type GetType(string typeName, bool throwOnError) { // LAMESPEC: what kinds of errors cause exception to be thrown? return internal_from_name (typeName); } [MonoTODO] public static Type GetType(string typeName, bool throwOnError, bool ignoreCase) { throw new NotImplementedException (); } public static Type[] GetTypeArray (object[] args) { Type[] ret; ret = new Type [args.Length]; for (int i = 0; i < args.Length; ++i) ret [i] = args[i].GetType (); return ret; } [MonoTODO] public static TypeCode GetTypeCode( Type type) { // FIXME return TypeCode.Empty; } [MonoTODO] public static Type GetTypeFromCLSID (Guid clsid) { throw new NotImplementedException (); } [MonoTODO] public static Type GetTypeFromCLSID (Guid clsid, bool throwOnError) { throw new NotImplementedException (); } [MonoTODO] public static Type GetTypeFromCLSID (Guid clsid, string server) { throw new NotImplementedException (); } [MonoTODO] public static Type GetTypeFromCLSID (Guid clsid, string server, bool throwOnError) { throw new NotImplementedException (); } public static Type GetTypeFromHandle (RuntimeTypeHandle handle) { return internal_from_handle (handle); } [MonoTODO] public static Type GetTypeFromProgID (string progID) { throw new NotImplementedException (); } [MonoTODO] public static Type GetTypeFromProgID (string progID, bool throwOnError) { throw new NotImplementedException (); } [MonoTODO] public static Type GetTypeFromProgID (string progID, string server) { throw new NotImplementedException (); } [MonoTODO] public static Type GetTypeFromProgID (string progID, string server, bool throwOnError) { throw new NotImplementedException (); } public static RuntimeTypeHandle GetTypeHandle (object o) { return o.GetType().TypeHandle; } [MethodImplAttribute(MethodImplOptions.InternalCall)] internal static extern bool type_is_subtype_of (Type a, Type b, bool check_interfaces); public virtual bool IsSubclassOf (Type c) { return type_is_subtype_of (this, c, false); } [MonoTODO] public virtual Type[] FindInterfaces (TypeFilter filter, object filterCriteria) { // FIXME throw new NotImplementedException (); } public Type GetInterface (string name) { return GetInterface (name, false); } public abstract Type GetInterface (string name, bool ignoreCase); public virtual InterfaceMapping GetInterfaceMap (Type interfaceType) { throw new NotImplementedException (); } public abstract Type[] GetInterfaces (); [MonoTODO] public virtual bool IsAssignableFrom (Type c) { // FIXME return type_is_subtype_of (c, this, true); } public virtual bool IsInstanceOfType (object o) { if (o != null) { return o.GetType().IsSubclassOf (this); } return false; } [MonoTODO] public virtual int GetArrayRank () { // FIXME throw new NotImplementedException (); } public abstract Type GetElementType (); [MonoTODO] public EventInfo GetEvent (string name) { throw new NotImplementedException (); } public abstract EventInfo GetEvent (string name, BindingFlags bindingAttr); public virtual EventInfo[] GetEvents () { return GetEvents (BindingFlags.Public|BindingFlags.Static|BindingFlags.Instance); } public abstract EventInfo[] GetEvents (BindingFlags bindingAttr); public FieldInfo GetField( string name) { return GetField (name, BindingFlags.Public); } public abstract FieldInfo GetField( string name, BindingFlags bindingAttr); public FieldInfo[] GetFields () { return GetFields (BindingFlags.Public|BindingFlags.Instance|BindingFlags.Static); } public abstract FieldInfo[] GetFields (BindingFlags bindingAttr); public override int GetHashCode() { return (int)_impl.Value; } public MemberInfo[] GetMember( string name) { return GetMember (name, BindingFlags.Public); } [MonoTODO] public virtual MemberInfo[] GetMember( string name, BindingFlags bindingAttr) { // FIXME throw new NotImplementedException (); } [MonoTODO] public virtual MemberInfo[] GetMember( string name, MemberTypes type, BindingFlags bindingAttr) { // FIXME throw new NotImplementedException (); } public MemberInfo[] GetMembers() { return GetMembers (BindingFlags.Public|BindingFlags.Static|BindingFlags.Instance); } public abstract MemberInfo[] GetMembers( BindingFlags bindingAttr); [MethodImplAttribute(MethodImplOptions.InternalCall)] private static extern MethodInfo get_method (Type type, string name, Type[] types); public MethodInfo GetMethod( string name) { return GetMethod (name, BindingFlags.Public); } [MonoTODO] public MethodInfo GetMethod( string name, BindingFlags bindingAttr) { // FIXME throw new NotImplementedException (); } public MethodInfo GetMethod (string name, Type[] types) { return get_method (this, name, types); } [MonoTODO] public MethodInfo GetMethod( string name, Type[] types, ParameterModifier[] modifiers) { // FIXME throw new NotImplementedException (); } [MonoTODO] public MethodInfo GetMethod( string name, BindingFlags bindingAttr, Binder binder, Type[] types, ParameterModifier[] modifiers) { // FIXME throw new NotImplementedException (); } [MonoTODO] public MethodInfo GetMethod( string name, BindingFlags bindingAttr, Binder binder, CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers) { // FIXME throw new NotImplementedException (); } protected abstract MethodInfo GetMethodImpl( string name, BindingFlags bindingAttr, Binder binder, CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers); public MethodInfo[] GetMethods () { return GetMethods (BindingFlags.Public|BindingFlags.Instance|BindingFlags.Static); } public abstract MethodInfo[] GetMethods (BindingFlags bindingAttr); public Type GetNestedType( string name) { return GetNestedType (name, BindingFlags.Public); } public abstract Type GetNestedType( string name, BindingFlags bindingAttr); public Type[] GetNestedTypes () { return GetNestedTypes (BindingFlags.Public); } public abstract Type[] GetNestedTypes (BindingFlags bindingAttr); public PropertyInfo[] GetProperties () { return GetProperties (BindingFlags.Public|BindingFlags.Static|BindingFlags.Instance); } public abstract PropertyInfo[] GetProperties( BindingFlags bindingAttr); [MethodImplAttribute(MethodImplOptions.InternalCall)] private static extern PropertyInfo get_property (Type type, string name, Type[] types); public PropertyInfo GetProperty (string name) { return GetProperty (name, BindingFlags.Public); } [MonoTODO] public PropertyInfo GetProperty( string name, BindingFlags bindingAttr) { // FIXME throw new NotImplementedException (); } [MonoTODO] public PropertyInfo GetProperty( string name, Type returnType) { // FIXME throw new NotImplementedException (); } public PropertyInfo GetProperty (string name, Type[] types) { return get_property (this, name, types); } [MonoTODO] public PropertyInfo GetProperty (string name, Type returnType, Type[] types) { // FIXME throw new NotImplementedException (); } [MonoTODO] public PropertyInfo GetProperty( string name, Type returnType, Type[] types, ParameterModifier[] modifiers) { // FIXME throw new NotImplementedException (); } [MonoTODO] public PropertyInfo GetProperty( string name, BindingFlags bindingAttr, Binder binder, Type returnType, Type[] types, ParameterModifier[] modifiers) { // FIXME throw new NotImplementedException (); } protected abstract PropertyInfo GetPropertyImpl( string name, BindingFlags bindingAttr, Binder binder, Type returnType, Type[] types, ParameterModifier[] modifiers); [MethodImplAttribute(MethodImplOptions.InternalCall)] private static extern ConstructorInfo get_constructor (Type type, Type[] types); protected abstract ConstructorInfo GetConstructorImpl (BindingFlags bindingAttr, Binder binder, CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers); protected abstract TypeAttributes GetAttributeFlagsImpl (); protected abstract bool HasElementTypeImpl (); protected abstract bool IsArrayImpl (); protected abstract bool IsByRefImpl (); protected abstract bool IsCOMObjectImpl (); protected virtual bool IsContextfulImpl () { return typeof (ContextBoundObject).IsAssignableFrom (this); } [MonoTODO] protected virtual bool IsMarshalByRefImpl () { // FIXME return false; } protected abstract bool IsPointerImpl (); protected abstract bool IsPrimitiveImpl (); protected abstract bool IsValueTypeImpl (); public ConstructorInfo GetConstructor (Type[] types) { return get_constructor (this, types); } [MonoTODO] public ConstructorInfo GetConstructor (BindingFlags bindingAttr, Binder binder, Type[] types, ParameterModifier[] modifiers) { throw new NotImplementedException (); } [MonoTODO] public ConstructorInfo GetConstructor( BindingFlags bindingAttr, Binder binder, CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers) { throw new NotImplementedException (); } public ConstructorInfo[] GetConstructors () { return GetConstructors (BindingFlags.Public|BindingFlags.Static|BindingFlags.Instance); } public abstract ConstructorInfo[] GetConstructors (BindingFlags bindingAttr); [MonoTODO] public virtual MemberInfo[] GetDefaultMembers () { throw new NotImplementedException (); } public virtual MemberInfo[] FindMembers( MemberTypes memberType, BindingFlags bindingAttr, MemberFilter filter, object filterCriteria) { MemberInfo[] result; ArrayList l = new ArrayList (); //Console.WriteLine ("FindMembers for {0} (Type: {1}): {2}", this.FullName, this.GetType().FullName, this.obj_address()); if ((memberType & MemberTypes.Constructor) != 0) { ConstructorInfo[] c = GetConstructors (bindingAttr); if (filter != null) { foreach (MemberInfo m in c) { if (filter (m, filterCriteria)) l.Add (m); } } else { l.AddRange (c); } } if ((memberType & MemberTypes.Event) != 0) { EventInfo[] c = GetEvents (bindingAttr); if (filter != null) { foreach (MemberInfo m in c) { if (filter (m, filterCriteria)) l.Add (m); } } else { l.AddRange (c); } } if ((memberType & MemberTypes.Field) != 0) { FieldInfo[] c = GetFields (bindingAttr); if (filter != null) { foreach (MemberInfo m in c) { if (filter (m, filterCriteria)) l.Add (m); } } else { l.AddRange (c); } } if ((memberType & MemberTypes.Method) != 0) { MethodInfo[] c = GetMethods (bindingAttr); if (filter != null) { foreach (MemberInfo m in c) { if (filter (m, filterCriteria)) l.Add (m); } } else { l.AddRange (c); } } if ((memberType & MemberTypes.Property) != 0) { PropertyInfo[] c; int count = l.Count; Type ptype; if (filter != null) { ptype = this; while ((l.Count == count) && (ptype != null)) { c = ptype.GetProperties (bindingAttr); foreach (MemberInfo m in c) { if (filter (m, filterCriteria)) l.Add (m); } ptype = ptype.BaseType; } } else { c = GetProperties (bindingAttr); l.AddRange (c); } } result = new MemberInfo [l.Count]; l.CopyTo (result); return result; } [MonoTODO] public object InvokeMember( string name, BindingFlags invokeAttr, Binder binder, object target, object[] args) { // FIXME return null; } [MonoTODO] public object InvokeMember( string name, BindingFlags invokeAttr, Binder binder, object target, object[] args, CultureInfo culture) { // FIXME return null; } public abstract object InvokeMember( string name, BindingFlags invokeAttr, Binder binder, object target, object[] args, ParameterModifier[] modifiers, CultureInfo culture, string[] namedParameters); public override string ToString() { string res = FullName; if (IsArray) res = res + "[]"; if (IsByRef) res = res + "&"; if (IsPointer) res = res + "*"; return res; } } }