Compatibilità con Mono 1.2

Topics: Developer Forum
Nov 30, 2006 at 4:56 PM
Con un piccolo sforzo la libreria potrebbe essere completamente compatibile con Mono 1.2. Ho provato ad utilizzare il Mono Migration Analyzer che ha trovato solo un metodo non presente in Mono. Questo il risultato del controllo:

Calling Method Method not yet in Mono
Class Vevy.Collections.RafCollection`1:
T CreateT() Object TypeDescriptor.CreateInstance(IServiceProvider, Type, Type[], Object[])

Il metodo da modificare all'interno del file RafCollectionAddInsert.cs è il seguente:

/// <summary>
/// Create a new element of type T
/// It's necessary that T has a default constructor (parameterless)
/// </summary>
/// <returns>Created item</returns>
private T CreateT()
{
T NewObject = (T)TypeDescriptor.CreateInstance(null, typeof(T), null, null);
return NewObject;
}

Qualcuno conosce un metodo per creare una istanza che non utilizzi TypeDescriptor.CreateInstance?

Ciao

Alessandro
Nov 30, 2006 at 5:40 PM
E modificare il codice da così:

T NewObject = (T)TypeDescriptor.CreateInstance(null, typeof(T), null, null);

a così:

T NewObject = (T)Activator.CreateInstance(typeof(T));

Cosa ne dite? In questo modo Mono 1.2 può compilare tutto senza problemi. Non ho ancora avuto il tempo di provarla, ma entro sera lo faccio, anche perchè ho effettuato una sostituzione senza pensare molto alle conseguenze. Meglio informarsi prima di sparare stupidate vero?

Alessandro
Coordinator
Nov 30, 2006 at 6:32 PM
Grazie Pezze,
se non è un problema per te, è meglio che scriviamo in inglese :-)

The problem raised from Pezze is Mono 1.2 compatibility. So he run Mono Migration Analyzer and the only non-compatible method is the CreateInstance overload with four parameters.
He also suggest to change it with this one:
T NewObject = (T)Activator.CreateInstance(typeof(T));

I think it's a good solution and I agree that only testing it on Mono could be best answer.

Thanks Pezze!
Nov 30, 2006 at 7:03 PM
Da MSDN (http://msdn2.microsoft.com/en-us/library/system.componentmodel.typedescriptionprovider.createinstance.aspx):

public virtual Object CreateInstance (
IServiceProvider provider,
Type objectType,
Type[] argTypes,
Object[] args
)

The CreateInstance method is virtual and, by default, returns the result of the System.Activator.CreateInstance method if provider is a null reference.

Quindi questa riga in Raf Collection:
T NewObject = (T)TypeDescriptor.CreateInstance(null, typeof(T), null, null);

può essere tranquillamente (se non ho capito male) convertita in:
T NewObject = (T)Activator.CreateInstance(typeof(T));

essendo il parametro provider = null. Con questa modifica l'assembly passa tranquillamente il test di Mono anche se non compila sotto Mono. Ora vado avanti ad investigare. Nel caso peggiore apro un altro post nel forum.

Nov 30, 2006 at 7:05 PM
Per Raffaele: Hai ragione, scusa.

From MSDN (http://msdn2.microsoft.com/en-us/library/system.componentmodel.typedescriptionprovider.createinstance.aspx):

public virtual Object CreateInstance (
IServiceProvider provider,
Type objectType,
Type[] argTypes,
Object[] args
)

The CreateInstance method is virtual and, by default, returns the result of the System.Activator.CreateInstance method if provider is a null reference.

So, this line:
T NewObject = (T)TypeDescriptor.CreateInstance(null, typeof(T), null, null);

could be changed to:
T NewObject = (T)Activator.CreateInstance(typeof(T));

beacuse provider parameter is null. Now the assembly can pass Mono compatibility test but it doesn't compile yet. Now I'll try to understand compilation problems.