un constructeur en tant que délégué - est-il possible en C#?
J'ai une classe comme ci-dessous:
class Foo
{
public Foo(int x) { ... }
}
et j'ai besoin de passer à une certaine méthode un délégué comme ceci:
delegate Foo FooGenerator(int x);
Est-il possible de passer le constructeur directement comme un FooGenerator
valeur, sans avoir à taper:
delegate(int x) { return new Foo(x); }
?
EDIT: Pour mon usage personnel, la question se réfère .NET 2.0, mais conseils/réponses pour la 3.0+ sont la bienvenue.
- Question intéressante. Je crois que les constructeurs sont effectivement des méthodes d'aussi loin que le CLR est concerné, mais je ne connais pas la syntaxe.
- Je suis intéressé: pourquoi voudriez-vous faire cela?
- Je soupçonne que la réponse est non mais.
- Blé: en plus de détails: 1) j'ai eu des classes de Deriv1 " et "Deriv2' étendre 'Foo', 2) j'ai eu une méthode 'SomeLogic ()" qui a parfois besoin de créer un 'Foo'objet dérivé basé sur 'x', 3) et je voulais décider si cela doit être "Deriv1" ou "Deriv2' lors de l'appel de la méthode. Maintenant que je pense à cela, je pourrais envisager d'utiliser une méthode de modèle... mais pour que cela soit une réponse, je devrais plutôt ouvrir une autre question 🙂 +1 & bravo à vous en tout cas 🙂
- (a répondu à un commentaire)
Vous devez vous connecter pour publier un commentaire.
Nope, le CLR ne pas permettre la liaison des délégués à
ConstructorInfo
.Cependant, vous pouvez tout simplement créer votre propre:
Utilisation
ConstructorInfo
!=MethodInfo
, d'où un délégué ne peut pas être créé à partir d'unConstructorInfo
(comme il n'est pas une Méthode).public static <SELF> Create<SELF>(/* args */)
méthodes. Donc vous pouvez direFunc<string, string, Foo> = Foo.CreateFoo
.class SomeClass
, vous devez soit ajouter une méthode pour que la définition de la classe, ou d'ajouter une extension de la méthode dans une classe statique. Je ne vois pas les circonstances dans lesquelles votre suggestion serait préférable de leppie de réponse, ce qui "fonctionne", en misant sur le compilateur du moteur d'inférence. L'utilisation de laFoo.CreateFoo
pas assez de plus facile que deMake<Foo>
.Je suis en supposant que vous auriez normalement faire quelque chose comme ceci dans le cadre d'une usine de mise en œuvre, où les types réels ne sont pas connus au moment de la compilation...
Tout d'abord, notez qu'une approche plus facile peut-être un post-créer init étape, vous pouvez utiliser des génériques:
Vous pouvez ensuite utiliser
MakeGenericMethod
et/ouCreateDelegate
.Autrement; vous pouvez faire cela avec à la volée avec
Expression
(3.5) ouDynamicMethod
(2.0).La
Expression
approche est plus facile à code:ou (à l'aide de
DynamicMethod
):Je pense aussi concis que vous allez obtenir (sans passer par un modèle de fabrique) serait quelque chose avec les méthodes anonymes, comme ceci:
Ce n'est pas de faire strictement ce que vous avez demandé (puisque vous êtes de passage d'un délégué à une méthode anonyme qui retourne une nouvelle instance, plutôt qu'un délégué du constructeur), mais je ne pense pas que ce que vous demandez est strictement possible.
C'est, bien sûr, en supposant que vous êtes en utilisant 3.5+
Il semble que vous voulez probablement à l'aide de la classe modèle de fabrique.
Méthode De Fabrique De Modèle
Malheureusement pas, les constructeurs ne sont pas tout à fait les mêmes choses que les méthodes et en tant que tel vous ne pouvez pas créer un délégué qui pointe vers eux. C'est une idée intéressante si, peut-être avec plus d'informations, nous avons pu concevoir une sorte de solution de contournement serait la syntaxe est similaire.
Marc Gravel de la réponse qui m'a inspiré pour la suite de la solution très simple:
Presque la même chose si votre constructeur a params (dans cet exemple: 1 paramètre de type int):
Ma conjecture est qu'il n'est pas possible, car vous passerez une méthode d'un objet qui n'a pas encore été créé.