9 votes

Créer un objet en C# sans utiliser le mot-clé new ?

Existe-t-il un moyen de créer un objet sans utiliser le mot clé new en C#, quelque chose comme class.forname() ; en java.

Je veux créer dynamiquement un objet d'une classe. La création de l'objet peut dépendre de la saisie de l'utilisateur.
J'ai une classe de base x et il y a 5 sous-classes (a,b,c,d,e) de celle-ci. L'utilisateur saisit les noms des classes a, b ou... e. Il doit créer un objet de cette classe. En utilisant cela, je dois créer un objet de cette classe, comment puis-je le faire ?

15voto

Kralizek Points 669

Vous pouvez utiliser le Classe d'activateur .

Type type = typeof(MyClass);
object[] parameters = new object[]{1, "hello", "world" };
object obj = Activator.CreateInstance(type, parameters);
MyClass myClass = obj as MyClass;

3voto

CodeCaster Points 38181

Vous voulez dire une classe statique ?

static class Foo
{
    public static void Bar()
    {
        Console.WriteLine("Foo.Bar()");
    }
}

Vous pouvez alors appeler Foo.Bar(); .

Mais tu ferais mieux d'expliquer ce que tu essaies de faire. "Créer un objet sans l'utilisation de new "est une solution que vous avez trouvée à un problème que vous rencontrez. Le fait d'expliquer ce problème peut révéler un moyen plus facile de le résoudre.

Edit : vous semblez avoir besoin d'un usine Compte tenu de votre commentaire "Je veux créer dynamiquement un objet d'une classe. La création de l'objet peut dépendre de la saisie de l'utilisateur".

Quelque chose comme ça peut donc être suffisant :

static class PizzaFactory
{
    static Pizza CreatePizza(String topping)
    {
        if (topping == "cheese")
        {
            return new CheesePizza();
        }
        else if (topping == "salami")
        {
            return new SalamiPizza();
        }
    }
}

class Pizza { }
class CheesePizza : Pizza { }
class SalamiPizza : Pizza { }

En ajoutant une interface ou une classe abstraite si nécessaire.

0voto

sehe Points 123151

Vous pouvez utiliser le default mais il ne donnera lieu à une instance que pour les types de valeurs :

var s = default(string); // null
var i = default(int);    // integer (0)

0voto

Serghei Points 2526

La classe activateur est très lente, vous pouvez utiliser les expressions lambda, regardez ceci Activateur alternatif

-4voto

Exitos Points 4805

Vous pouvez le faire avec

typeof(MyType)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X