using System;
using System.Text;
using System.Runtime.InteropServices;
namespace AnticipatingMinds.PlatformServices.UnmanagedReflection{
/// <summary>
/// Summary description for PropertyInfo.
/// </summary>
public class PropertyInfo : MemberInfo
{
public PropertyInfo(AssemblyInfo assemblyInfo, uint propertyToken):base(assemblyInfo, propertyToken)
{
uint uintTemp;
IntPtr ptrTemp;
int intTemp;
IntPtr signatureBlobPtr;
int signatureBlobSize;
uint getterToken = 0;
uint setterToken = 0;
int nameLength = 0;
assemblyInfo.MetadataImport.GetPropertyProps(propertyToken,out uintTemp,null,0,out nameLength,out propertyAttributes,out signatureBlobPtr,out signatureBlobSize,out intTemp,out ptrTemp,out intTemp,out setterToken,out getterToken,null,0,out intTemp);
StringBuilder nameBuilder = new StringBuilder(nameLength);
assemblyInfo.MetadataImport.GetPropertyProps(propertyToken,out uintTemp,nameBuilder,nameBuilder.Capacity+1,out nameLength,out uintTemp,out signatureBlobPtr,out signatureBlobSize,out intTemp,out ptrTemp,out intTemp,out setterToken,out getterToken,null,0,out intTemp);
name = nameBuilder.ToString();
byte[] signature = new byte[signatureBlobSize];
Marshal.Copy(signatureBlobPtr,signature,0,signatureBlobSize);
int cursor = 0;
uint callingConvention = CorSigUncompressData(signature, ref cursor);
uint paramCount = CorSigUncompressData(signature, ref cursor);
propertyType = DecodeType(signature, ref cursor);
//Get property parameters
parameters = new ParameterInfo[paramCount];
for(int i = 0; i < paramCount; i++)
{
uint parameterToken;
if(getterToken != 0)
assemblyInfo.MetadataImport.GetParamForMethodIndex(getterToken,i+1,out parameterToken);
else
assemblyInfo.MetadataImport.GetParamForMethodIndex(setterToken,i+1,out parameterToken);
parameters[i] = new ParameterInfo(assemblyInfo,parameterToken,DecodeType(signature, ref cursor));
}
if(getterToken != 0)
getterMethod = new MethodInfo(assemblyInfo,getterToken);
if(setterToken != 0)
setterMethod = new MethodInfo(assemblyInfo,setterToken);
}
public string PropertyType
{
get
{
return propertyType;
}
}
public ParameterInfo[] Parameters
{
get
{
return parameters;
}
}
public MethodInfo GetterMethodInfo
{
get
{
return getterMethod;
}
}
public MethodInfo SetterMethodInfo
{
get
{
return setterMethod;
}
}
public System.Reflection.PropertyAttributes CorAttributes
{
get
{
return (System.Reflection.PropertyAttributes) propertyAttributes;
}
}
public string Name
{
get
{
return name;
}
}
string name;
uint propertyAttributes = 0;
private string propertyType;
private ParameterInfo[] parameters;
private MethodInfo getterMethod;
private MethodInfo setterMethod;
}
}
|