CatZMedlem sedan jan. 20022 440 inläggNu har jag inte alls hunnit titta på det du skrev Nickemannen... men när jag försöker kalla på metoden med
GetWrappedList<AlarmDataStructHolder, AlarmDataStruct>(IEnumerable<<alarmlist>);
så får jag att
Visual Studio 2008 skrev:
The type
'EFTest.AlarmDataStructHolder'
cannot be used as type parameter
'TClass'
in the generic type or method
'GetWrappedList<TClass,TStruct>(System.Collections.Generic.IEnumerable<TStruct>)'.
There is no implicit reference conversion
from
'EFTest.AlarmDataStructHolder'
to
'EFTest.Form1.IStructHolder<EFTest.AlarmDataStruct>'
Jag är inte med riktigt men jag ska studera det lite senare ;)
spangoMedlem sedan juni 20008 205 inlägg
Nickemannen skrev:
Activator.CreateInstance är inte så snabb så denna lösning bör fungera bättre.
[I]*** snip[/I]
TClass wrappedStructClass = new TClass();
Faktum är att en generisk new är långsammare än ett anrop till Activator.CreateInstance (och därmed MYCKET långsammare än vanliga konstruktoranrop), och involverar faktiskt ett anrop till just Activator.CreateInstance. Jag har inte satt mig in tillräckligt mycket i den IL-koden det ger upphov till, men skulle gissa att följande kod...
class X<T> where T : new()
{
public T Create()
{
return new T();
}
}
... är likvärdig med följande:
class X<T> where T : new()
{
public T Create()
{
try
{
return Activator.CreateInstance<T>();
}
catch (TargetInvocationException e)
{
throw e.InnerException;
}
}
}
Man får således ingen prestandavinst av new om man gör det på en parametriserad typ, tvärtom. Däremot beter sig koden mer som man skulle förvänta sig.
hmm, det stämmer nog, fick det nog lite om bakfoten när jag antog att generics genererade kod som sedan kompilerades. :S