Ahoj, našel jsem kód, který má fungovat oproti třídě reflection, kde se pro vytvoření třídy používá Activator.CreateInstance(...), mnohem rychleji. Nechápu proč to nefunguje pokud jsou parametry konstruktoru s modifikátorem jako je in, ref, out. V debuggeru to na chybové rádce píše, že se přiřazuje parametr typu s modifikátorem ByRef, ale očekáván je typ bez tohoto modifikátoru. Pokud se ale kouknu na proměnnou typu ConstructorInfo, tak tam je, že konstruktor má parametr s modifikátorem ByRef a stejně tak proměnná parametru... tak proč to nejde.
V kódu je vykomentováno odstranění modifikátoru ByRef z typu, pokud je ale tato část, která aspoň podle mě přepisuje správné typy na špatné, součástí kódu, tak to funguje, což je druhá záhada.
public delegate T ObjectActivator<T>(params object[] args);
public ObjectActivator<T> GetActivator<T>(System.Reflection.ConstructorInfo ctor)
{
System.Reflection.ParameterInfo[] paramsInfo = ctor.GetParameters();
ParameterExpression param = Expression.Parameter(typeof(object[]), "args");
Expression[] argsExp = new Expression[paramsInfo.Length];
for (int i = 0; i < paramsInfo.Length; i++)
{
Expression index = Expression.Constant(i);
Type paramType = paramsInfo[i].ParameterType;
//??? kod funguje po odstranění ByRef z typu
// if (paramType.IsByRef == true)
// paramType = paramType.GetElementType();
//???
Expression paramAccessorExp = Expression.ArrayIndex(param, index);
Expression paramCastExp = Expression.Convert(paramAccessorExp, paramType);
argsExp[i] = paramCastExp;
}
NewExpression newExp = Expression.New(ctor, argsExp); //error
LambdaExpression lambda = Expression.Lambda(typeof(ObjectActivator<T>), newExp, param);
return (ObjectActivator<T>)lambda.Compile();
}