C# volání konstruktoru přes lambda expression – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

C# volání konstruktoru přes lambda expression – .NET – Fórum – Programujte.comC# volání konstruktoru přes lambda expression – .NET – Fórum – Programujte.com

 

Kartmen
~ Anonymní uživatel
57 příspěvků
12. 12. 2019   #1
-
0
-

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();
}
Nahlásit jako SPAM
IP: 88.100.186.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 19 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý