3 votes

Stockage/moulage du Paramètre<T> en tant que Paramètre<object> incluant Paramètre<int>?

J'ai besoin de stocker le Parameter retourné par Build() en tant que ```Parameter (parce que je stocke les paramètres dans un tableau, l'autre façon est trop copiée-collée de la même classe pour chaque quantité de paramètres, puisque c# n'a pas de génériques variadiques).

Le problème est le cast `(Parameter) (object) (/* valeur de type Parameter */);, puisqueintn'est pas castable enobject`. Comment résoudre ce problème?

J'ai le monstre suivant (imaginez que T1 est int) :

    public static IEventBuilder<(IOrigin origin, T1 arg1, T2 arg2)>
        Params(
            this IEventBuilder<(IOrigin origin, string msg)> eventBuilder,
            Func, IParameterBuilder> param1,
            Func, IParameterBuilder> param2)
    {
        return new ParamsBuilder<(IOrigin, T1, T2)>(
            eventBuilder,
            (origin, objs) => (origin, (T1) objs[0], (T2) objs[1]), // ignorer cette ligne
            (Parameter) (object) param1(new RootParameterBuilder()).Build(),  // Build() renvoie Parameter (par exemple, int)
            (Parameter) (object) param2(new RootParameterBuilder()).Build());
    }

Pas vraiment important, mais au cas où vous auriez besoin d'un peu de contexte, voici un exemple d'utilisation de Params :

        _dispatcher.On // IEventBuilder
            .Chat() // IEventBuilder<(IOrigin, string)>
            .Params( // IEventBuilder<(IOrigin, double)>
                p => p // IParameterBuilder
                    .Transform(Convert.ToInt32) // IParameterBuilder
                    .Transform(i => i + 128.0)) // IParameterBuilder
            .Invoke(t =>
            {
                // t is (IOrigin, double)
            });`` ```

3voto

Evk Points 17804

Si rien d'autre n'aide - créez la classe Parameter, déplacez (et ajustez) toute la fonctionnalité partagée là-bas et héritez de Parameter. Dans ce cas, vous pouvez déplacer le drapeau Optional et ajuster ParseFunc:

public Func ParseFuncUntyped {get; protected set;}

Ensuite, attribuez cette fonction dans le constructeur de Parameter et stockez vos paramètres en tant que Parameter

0voto

nvoigt Points 20484

Pour stocker un Paramètre dans un `Paramètre n'est pas possible. Cela dit, si vous créez une interfaceIParamètreet la rendez [covariante](https://docs.microsoft.com/en-us/dotnet/standard/generics/covariance-and-contravariance) (IParamètre), vous pourriez en effet stocker unIParamètredans unIParamètre.

` ``

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