Question

Non, ce n'est pas une question de génériques.

J'ai un modèle Factory avec plusieurs classes avec des constructeurs internes (je ne veux pas qu'ils soient instanciés sinon via l'usine).

Mon problème est que CreateInstance échoue avec une erreur « Aucun constructeur sans paramètre défini pour cet objet » sauf si je passe « vrai » sur le paramètre non public.

Exemple

// Fails
Activator.CreateInstance(type);

// Works
Activator.CreateInstance(type, true);

Je voulais rendre l'usine générique pour la rendre un peu plus simple, comme ceci :

public class GenericFactory<T> where T : MyAbstractType
{
    public static T GetInstance()
    {
        return Activator.CreateInstance<T>();
    }
}

Cependant, je n'ai pas réussi à trouver comment transmettre ce "vrai" paramètre pour qu'il accepte les constructeurs non publics (internes).

Ai-je raté quelque chose ou ce n'est pas possible ?

Était-ce utile?

La solution

Pour contourner ce problème, ne pourriez-vous pas simplement modifier votre utilisation en tant que telle :

public class GenericFactory<T> where T : MyAbstractType
{
    public static T GetInstance()
    {
        return Activator.CreateInstance(typeof(T), true);
    }
}

Votre méthode d'usine sera toujours générique, mais l'appel à l'activateur n'utilisera pas la surcharge générique.Mais vous devriez quand même obtenir les mêmes résultats.

Autres conseils

Si vous exigez absolument que le constructeur soit privé, vous pouvez essayer quelque chose comme ceci :

public abstract class GenericFactory<T> where T : MyAbstractType
{
    public static T GetInstance()
    {
        return (T)Activator.CreateInstance(typeof(T), true);
    }
}

Sinon, il vaut mieux ajouter la nouvelle contrainte et suivre cette voie :

public abstract class GenericFactory<T> where T : MyAbstractType, new()
{
    public static T GetInstance()
    {
        return new T;
    }
}

Vous essayez d'utiliser GenericFactory comme classe de base pour toutes vos usines plutôt que d'écrire chacune d'entre elles à partir de zéro, n'est-ce pas ?

en plus d'Activator.CreateInstance(typeof(T), true) pour fonctionner, T devrait avoir un constructeur par défaut

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top