web-dev-qa-db-fra.com

Type générique dans le constructeur

J'ai une interface de type générique et je veux qu'un constructeur d'un objet prenne l'interface générique.
Comme:

public Constructor(int blah, IGenericType<T> instance)
{}

Je veux que le code qui crée cet objet spécifie le IGenericType (utilisez l'inversion de contrôle). Je n'ai pas vu de moyen pour que cela se produise. Des suggestions pour y parvenir?

Je veux que quelqu'un crée l'objet comme:

Constructor varname = new Constructor(1, new GenericType<int>());
40
CSharpAtl

Vous ne pouvez pas rendre les constructeurs génériques, mais vous pouvez utiliser une méthode statique générique à la place:

public static Constructor CreateInstance<T>(int blah, IGenericType<T> instance)

puis faites tout ce dont vous avez besoin après le constructeur, si nécessaire. Une autre alternative dans certains cas pourrait être d'introduire une interface non générique qui étend l'interface générique.

EDIT: Selon les commentaires ...

Si vous souhaitez enregistrer l'argument dans l'objet nouvellement créé et que vous souhaitez le faire de manière fortement typée, le type doit également être générique.

À ce stade, le problème du constructeur disparaît, mais vous peut voulez de toute façon conserver une méthode générique statique dans un type non générique: vous pouvez donc tirer parti de l'inférence de type:

public static class Foo
{
    public static Foo<T> CreateInstance<T>(IGenericType<T> instance)
    {
        return new Foo<T>(instance);
    }
}

public class Foo<T>
{
    public Foo(IGenericType<T> instance)
    {
        // Whatever
    }
}

...

IGenericType<string> x = new GenericType<string>();
Foo<string> noInference = new Foo<string>(x);
Foo<string> withInference = Foo.CreateInstance(x);
48
Jon Skeet