using System; using System.Collections.Generic; using System.Linq; using System.Text; using ILRuntime.CLR.Method; using ILRuntime.CLR.TypeSystem; using ILRuntime.Runtime.Intepreter; using ILRuntime.Runtime.Stack; namespace ILRuntime.Runtime.Enviorment { public interface CrossBindingAdaptorType { ILTypeInstance ILInstance { get; } } /// /// This interface is used for inheritance and implementation of CLR Types or interfaces /// public abstract class CrossBindingAdaptor : IType { IType type; /// /// This returns the CLR type to be inherited or CLR interface to be implemented /// public abstract Type BaseCLRType { get; } /// /// If this Adaptor is capable to impelement multuple interfaces, use this Property, AND BaseCLRType should return null /// public virtual Type[] BaseCLRTypes { get { return null; } } public abstract Type AdaptorType { get; } public abstract object CreateCLRInstance(Enviorment.AppDomain appdomain, ILTypeInstance instance); internal IType RuntimeType { get { return type; } set { type = value; } } #region IType Members public IMethod GetMethod(string name, int paramCount, bool declaredOnly = false) { return type.GetMethod(name, paramCount, declaredOnly); } public IMethod GetMethod(string name, List param, IType[] genericArguments, IType returnType = null, bool declaredOnly = false) { return type.GetMethod(name, param, genericArguments, returnType, declaredOnly); } public List GetMethods() { return type.GetMethods(); } public int GetFieldIndex(object token) { return type.GetFieldIndex(token); } public IMethod GetConstructor(List param) { return type.GetConstructor(param); } public bool CanAssignTo(IType type) { bool res = false; if (BaseType != null) res = BaseType.CanAssignTo(type); var interfaces = Implements; if (!res && interfaces != null) { for (int i = 0; i < interfaces.Length; i++) { var im = interfaces[i]; res = im.CanAssignTo(type); if (res) return true; } } return res; } public IType MakeGenericInstance(KeyValuePair[] genericArguments) { return type.MakeGenericInstance(genericArguments); } public IType MakeByRefType() { return type.MakeByRefType(); } public IType MakeArrayType(int rank) { return type.MakeArrayType(rank); } public IType FindGenericArgument(string key) { return type.FindGenericArgument(key); } public IType ResolveGenericType(IType contextType) { return type.ResolveGenericType(contextType); } public IMethod GetVirtualMethod(IMethod method) { return type.GetVirtualMethod(method); } public void GetValueTypeSize(out int fieldCout, out int managedCount) { type.GetValueTypeSize(out fieldCout, out managedCount); } public bool IsGenericInstance { get { return type.IsGenericInstance; } } public KeyValuePair[] GenericArguments { get { return type.GenericArguments; } } public Type TypeForCLR { get { return type.TypeForCLR; } } public IType ByRefType { get { return type.ByRefType; } } public IType ArrayType { get { return type.ArrayType; } } public string FullName { get { return type.FullName; } } public string Name { get { return type.Name; } } public bool IsValueType { get { return type.IsValueType; } } public bool IsPrimitive { get { return type.IsPrimitive; } } public bool IsEnum { get { return type.IsEnum; } } public bool IsDelegate { get { return type.IsDelegate; } } public AppDomain AppDomain { get { return type.AppDomain; } } public Type ReflectionType { get { return type.ReflectionType; } } public IType BaseType { get { return type.BaseType; } } public IType[] Implements { get { return type.Implements; } } public bool HasGenericParameter { get { return type.HasGenericParameter; } } public bool IsGenericParameter { get { return type.IsGenericParameter; } } public bool IsArray { get { return false; } } public bool IsByRef { get { return type.IsByRef; } } public bool IsInterface { get { return type.IsInterface; } } public IType ElementType { get { return type.ElementType; } } public int ArrayRank { get { return type.ArrayRank; } } public int TotalFieldCount { get { return type.TotalFieldCount; } } public StackObject DefaultObject { get { return default(StackObject); } } public int TypeIndex { get { return -1; } } #endregion } }