mirror of
https://github.com/Phantop/LADXHD.git
synced 2024-11-01 04:14:22 +00:00
48 lines
1.6 KiB
C#
48 lines
1.6 KiB
C#
using System;
|
|
using System.Linq.Expressions;
|
|
using System.Reflection;
|
|
|
|
namespace ProjectZ.Base
|
|
{
|
|
public class ObjActivator
|
|
{
|
|
public delegate T ObjectActivator<T>(params object[] args);
|
|
|
|
public static ObjectActivator<T> GetActivator<T>(ConstructorInfo ctor)
|
|
{
|
|
var paramsInfo = ctor.GetParameters();
|
|
|
|
//create a single param of type object[]
|
|
var param = Expression.Parameter(typeof(object[]), "args");
|
|
|
|
var argsExp = new Expression[paramsInfo.Length];
|
|
|
|
//pick each arg from the params array
|
|
//and create a typed expression of them
|
|
for (var i = 0; i < paramsInfo.Length; i++)
|
|
{
|
|
Expression index = Expression.Constant(i);
|
|
Type paramType = paramsInfo[i].ParameterType;
|
|
|
|
Expression paramAccessorExp = Expression.ArrayIndex(param, index);
|
|
|
|
Expression paramCastExp = Expression.Convert(paramAccessorExp, paramType);
|
|
|
|
argsExp[i] = paramCastExp;
|
|
}
|
|
|
|
//make a NewExpression that calls the
|
|
//ctor with the args we just created
|
|
var newExp = Expression.New(ctor, argsExp);
|
|
|
|
//create a lambda with the New
|
|
//Expression as body and our param object[] as arg
|
|
var lambda = Expression.Lambda(typeof(ObjectActivator<T>), newExp, param);
|
|
|
|
//compile it
|
|
ObjectActivator<T> compiled = (ObjectActivator<T>)lambda.Compile();
|
|
return compiled;
|
|
}
|
|
}
|
|
}
|