| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 | 
							- using System;
 
- using System.Collections.Generic;
 
- using System.Linq;
 
- using System.Text;
 
- using ILRuntime.Mono.Cecil;
 
- using ILRuntime.CLR.Method;
 
- using ILRuntime.CLR.TypeSystem;
 
- namespace ILRuntime.Reflection
 
- {
 
-     static class Extensions
 
-     {
 
-         public static object CreateInstance(this CustomAttribute attribute, IType at, Runtime.Enviorment.AppDomain appdomain)
 
-         {
 
-             object ins;
 
-             List<IType> param = null;
 
-             if (at is ILType)
 
-             {
 
-                 var it = (ILType)at;
 
-                 if (!attribute.HasConstructorArguments)
 
-                     ins = it.Instantiate(true);
 
-                 else
 
-                 {
 
-                     ins = it.Instantiate(false);
 
-                     if (param == null)
 
-                         param = new List<IType>();
 
-                     param.Clear();
 
-                     object[] p = new object[attribute.ConstructorArguments.Count];
 
-                     for (int j = 0; j < attribute.ConstructorArguments.Count; j++)
 
-                     {
 
-                         var ca = attribute.ConstructorArguments[j];
 
-                         param.Add(appdomain.GetType(ca.Type, null, null));
 
-                         p[j] = ca.Value;
 
-                     }
 
-                     var ctor = it.GetConstructor(param);
 
-                     appdomain.Invoke(ctor, ins, p);
 
-                 }
 
-                 if (attribute.HasProperties)
 
-                 {
 
-                     object[] p = new object[1];
 
-                     foreach (var j in attribute.Properties)
 
-                     {
 
-                         p[0] = j.Argument.Value;
 
-                         var setter = it.GetMethod("set_" + j.Name, 1);
 
-                         appdomain.Invoke(setter, ins, p);
 
-                     }
 
-                 }
 
-                 if(attribute.HasFields)
 
-                 {
 
-                     foreach (var j in attribute.Fields)
 
-                     {
 
-                         int index;
 
-                         var field = it.GetField(j.Name, out index);
 
-                         if (field != null)
 
-                             ((ILRuntime.Runtime.Intepreter.ILTypeInstance)ins)[index] = j.Argument.Value;
 
-                     }
 
-                 }
 
-                 ins = ((ILRuntime.Runtime.Intepreter.ILTypeInstance)ins).CLRInstance;
 
-             }
 
-             else
 
-             {
 
-                 param = new List<IType>();
 
-                 object[] p = null;
 
-                 if (attribute.HasConstructorArguments)
 
-                 {
 
-                     p = new object[attribute.ConstructorArguments.Count];
 
-                     for (int j = 0; j < attribute.ConstructorArguments.Count; j++)
 
-                     {
 
-                         var ca = attribute.ConstructorArguments[j];
 
-                         param.Add(appdomain.GetType(ca.Type, null, null));
 
-                         p[j] = ca.Value;
 
-                     }
 
-                 }
 
-                 ins = ((CLRMethod)at.GetConstructor(param)).ConstructorInfo.Invoke(p);
 
-                 if (attribute.HasProperties)
 
-                 {
 
-                     foreach (var j in attribute.Properties)
 
-                     {
 
-                         var prop = at.TypeForCLR.GetProperty(j.Name);
 
-                         if (prop.PropertyType == typeof(Type) && j.Argument.Value != null)
 
-                         {
 
-                             var type = appdomain.GetType(j.Argument.Value, null, null);
 
-                             prop.SetValue(ins, type.TypeForCLR, null);
 
-                         }
 
-                         else
 
-                             prop.SetValue(ins, j.Argument.Value, null);
 
-                     }
 
-                 }
 
-                 if(attribute.HasFields)
 
-                 {
 
-                     foreach(var j in attribute.Fields)
 
-                     {
 
-                         var field = at.TypeForCLR.GetField(j.Name);
 
-                         field.SetValue(ins, j.Argument.Value);
 
-                     }
 
-                 }
 
-             }
 
-             return ins;
 
-         }
 
-     }
 
- }
 
 
  |