Le problème de l'exigence d'un constructeur public sans paramètre ne peut venir que du fait que Populate.GetList l'exige - c'est-à-dire qu'il a la contrainte "T : new()". Pour résoudre ce problème, il suffit d'ajouter la même contrainte à votre méthode.
En fait, je doute que ref
est une bonne stratégie ici. En poussant un peu, out
pourrait faire l'affaire (puisque vous ne lisez pas la valeur), mais une option beaucoup plus simple (et plus attendue) est une valeur de retour :
public IList<T> GetRecords<T>(T dataItem) where T : new()
{ // MG: what does dataItem do here???
return Populate.GetList<T>();
}
Bien sûr, à ce moment-là, l'appelant pourrait aussi bien appeler Populate.GetList
directement !
Je pense que vous pouvez également supprimer dataItem... mais la question n'est pas tout à fait claire.
Si vous ne voulez pas qu'il soit générique (et que dataItem est l'objet du modèle), vous pouvez le faire via MakeGenericMethod
:
public static IList GetRecords(object dataItem)
{
Type type = dataItem.GetType();
return (IList) typeof(Populate).GetMethod("GetList")
.MakeGenericMethod(type).Invoke(null,null);
}