You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

226 lines
6.5 KiB

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.Globalization;
using ILRuntime.Mono.Cecil;
using ILRuntime.CLR.Utils;
using ILRuntime.CLR.TypeSystem;
using ILRuntime.Runtime;
using ILRuntime.Runtime.Stack;
using ILRuntime.Runtime.Enviorment;
using ILRuntime.Runtime.Intepreter;
namespace ILRuntime.Reflection
{
public class ILRuntimeFieldInfo : FieldInfo
{
System.Reflection.FieldAttributes attr;
ILRuntimeType dType;
ILType ilType;
IType fieldType;
bool isStatic;
int fieldIdx;
string name;
FieldDefinition definition;
Runtime.Enviorment.AppDomain appdomain;
Attribute[] customAttributes;
Type[] attributeTypes;
public IType ILFieldType { get { return fieldType; } }
public ILRuntimeFieldInfo(FieldDefinition def, ILRuntimeType declaredType, bool isStatic, int fieldIdx)
{
definition = def;
this.name = def.Name;
dType = declaredType;
ilType = dType.ILType;
appdomain = ilType.AppDomain;
this.isStatic = isStatic;
this.fieldIdx = fieldIdx;
if (isStatic)
attr |= System.Reflection.FieldAttributes.Static;
if (def.IsPublic)
{
attr |= System.Reflection.FieldAttributes.Public;
}
else
attr |= System.Reflection.FieldAttributes.Private;
fieldType = isStatic ? ilType.StaticFieldTypes[fieldIdx] : ilType.FieldTypes[fieldIdx];
}
public ILRuntimeFieldInfo(FieldDefinition def, ILRuntimeType declaredType, int fieldIdx, IType fieldType)
{
definition = def;
this.name = def.Name;
dType = declaredType;
ilType = dType.ILType;
appdomain = ilType.AppDomain;
this.isStatic = false;
this.fieldIdx = fieldIdx;
if (isStatic)
attr |= System.Reflection.FieldAttributes.Static;
if (def.IsPublic)
{
attr |= System.Reflection.FieldAttributes.Public;
}
else
attr |= System.Reflection.FieldAttributes.Private;
this.fieldType = fieldType;
}
void InitializeCustomAttribute()
{
customAttributes = new Attribute[definition.CustomAttributes.Count];
attributeTypes = new Type[customAttributes.Length];
for (int i = 0; i < definition.CustomAttributes.Count; i++)
{
var attribute = definition.CustomAttributes[i];
var at = appdomain.GetType(attribute.AttributeType, null, null);
try
{
Attribute ins = attribute.CreateInstance(at, appdomain) as Attribute;
attributeTypes[i] = at.ReflectionType;
customAttributes[i] = ins;
}
catch
{
attributeTypes[i] = typeof(Attribute);
}
}
}
public override System.Reflection.FieldAttributes Attributes
{
get
{
return attr;
}
}
public override Type DeclaringType
{
get
{
return dType;
}
}
public override RuntimeFieldHandle FieldHandle
{
get
{
throw new NotImplementedException();
}
}
public override Type FieldType
{
get
{
return fieldType.ReflectionType;
}
}
public override string Name
{
get
{
return name;
}
}
public override Type ReflectedType
{
get
{
return fieldType.ReflectionType;
}
}
public override object[] GetCustomAttributes(bool inherit)
{
if (customAttributes == null)
InitializeCustomAttribute();
return customAttributes;
}
public override object[] GetCustomAttributes(Type attributeType, bool inherit)
{
if (customAttributes == null)
InitializeCustomAttribute();
List<Attribute> res = new List<Attribute>();
for (int i = 0; i < customAttributes.Length; i++)
{
if (attributeTypes[i].Equals(attributeType) || attributeTypes[i].IsSubclassOf(attributeType))
{
res.Add(customAttributes[i]);
}
}
return res.ToArray();
}
public override object GetValue(object obj)
{
unsafe
{
ILTypeInstance ins;
if (isStatic)
{
ins = ilType.StaticInstance;
}
else
{
if (obj is ILTypeInstance)
ins = (ILTypeInstance)obj;
else
ins = ((CrossBindingAdaptorType)obj).ILInstance;
}
return fieldType.TypeForCLR.CheckCLRTypes(ins[fieldIdx]);
}
}
public override bool IsDefined(Type attributeType, bool inherit)
{
if (customAttributes == null)
InitializeCustomAttribute();
for (int i = 0; i < customAttributes.Length; i++)
{
if (attributeTypes[i].Equals(attributeType))
{
return true;
}
}
return false;
}
public override void SetValue(object obj, object value, BindingFlags invokeAttr, Binder binder, CultureInfo culture)
{
unsafe
{
if (value is CrossBindingAdaptorType)
value = ((CrossBindingAdaptorType)value).ILInstance;
ILTypeInstance ins;
if (isStatic)
{
ins = ilType.StaticInstance;
}
else
{
if (obj is ILTypeInstance)
ins = (ILTypeInstance)obj;
else
ins = ((CrossBindingAdaptorType)obj).ILInstance;
}
ins[fieldIdx] = value;
}
}
}
}