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.
 
 
 
 
 
 

109 lines
3.4 KiB

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.Globalization;
using ILRuntime.CLR.TypeSystem;
namespace ILRuntime.Reflection
{
public class ILRuntimeParameterInfo : ParameterInfo
{
public IType IType { get; private set; }
public ILRuntime.Runtime.Enviorment.AppDomain AppDomain{ get; private set; }
Mono.Cecil.ParameterDefinition definition;
Attribute[] customAttributes;
Type[] attributeTypes;
public ILRuntimeParameterInfo(Mono.Cecil.ParameterDefinition definition, IType type, MemberInfo member, ILRuntime.Runtime.Enviorment.AppDomain appdomain)
{
this.IType = type;
this.definition = definition;
this.AppDomain = appdomain;
AttrsImpl = (ParameterAttributes)definition.Attributes;
ClassImpl = type.ReflectionType;
DefaultValueImpl = definition.Constant;
MemberImpl = member;
NameImpl = definition.Name;
PositionImpl = definition.Index;
}
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 bool HasDefaultValue
{
get { return definition.HasDefault; }
}
public override object DefaultValue
{
get { return DefaultValueImpl; }
}
public override object RawDefaultValue
{
get { return DefaultValueImpl; }
}
public override int MetadataToken
{
get { return definition.MetadataToken.ToInt32(); }
}
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))
res.Add(customAttributes[i]);
}
return res.ToArray();
}
public override bool IsDefined(Type attributeType, bool inherit)
{
var result = GetCustomAttributes(attributeType, inherit);
return result != null && result.Length > 0;
}
public override string ToString()
{
return definition == null ? base.ToString() : definition.ToString();
}
}
}