C # Réflexion, en utilisant MakeGenericMethod avec la méthode qui a la contrainte de type « nouvelle () »

StackOverflow https://stackoverflow.com/questions/2375422

Question

Je suis en train d'utiliser le MethodInfo MakeGenericMethod comme suit:

        foreach (var type in types)
        {
            object output = null;
            var method = typeof (ContentTypeResolver).GetMethod("TryConstruct");
            var genmethod = method.MakeGenericMethod(type);
            var arr = new object[] { from, output };
            if ((bool)genmethod.Invoke(null, arr))
                return (IThingy)arr[1];
        }

Contre la méthode générique suivante:

    public static bool TryConstruct<T>(string from, out IThingy result) where T : IThingy, new()
    {
        var thing = new T();
        return thingTryConstructFrom(from, out result);
    }

Le problème que j'avoir est que je reçois une exception arguement sur la ligne MakeGenericMethod comme le type que je passe est pas «nouvelle ()

Y at-il un moyen de contourner cela ?? Merci

Était-ce utile?

La solution

Non. Vous ne pouvez rendre les méthodes de TryConstruct fermées construites avec des paramètres de type qui répondent aux contraintes de IThingy et new. Sinon, vous seriez défaisant le contrat de TryConstruct: ce qui se passerait lorsque vous avez appelé TryConstruct et il a frappé la ligne de new T()? Il n'y aurait pas être un constructeur T (), de sorte que vous auriez violé la sécurité de type.

Vous devez vérifier ce type a un constructeur par défaut public avant de passer à MakeGenericMethod. Si vous avez besoin d'instancier types avec un constructeur non défini par défaut, vous devez créer une nouvelle méthode ou une surcharge TryConstruct, peut-être un qui utilise Activator.CreateInstance au lieu de new T().

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