首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Parameter<T>存储/转换为Parameter<object>,包括Parameter<int>?

将Parameter<T>存储/转换为Parameter<object>,包括Parameter<int>?
EN

Stack Overflow用户
提问于 2017-11-02 12:19:25
回答 2查看 81关注 0票数 3

我需要将Build()返回的Build()存储为一个Parameter<object> (因为我将参数存储在一个数组中,另一种方法就是对每个参数都粘贴相同的类,因为c#没有可变的泛型)。

问题在于cast (Parameter<object>) (object) (/* value of type Parameter<int> */);,因为int并不适用于object。我该如何解决这个问题?

我有以下怪物(假设T1int):

代码语言:javascript
复制
    public static IEventBuilder<(IOrigin origin, T1 arg1, T2 arg2)>
        Params<T1, T2>(
            this IEventBuilder<(IOrigin origin, string msg)> eventBuilder,
            Func<IParameterBuilder<string>, IParameterBuilder<T1>> param1,
            Func<IParameterBuilder<string>, IParameterBuilder<T2>> param2)
    {
        return new ParamsBuilder<(IOrigin, T1, T2)>(
            eventBuilder,
            (origin, objs) => (origin, (T1) objs[0], (T2) objs[1]), // ignore this line
            (Parameter<object>) (object) param1(new RootParameterBuilder()).Build(),  // Build() returns Parameter<T1> (e.g. int)
            (Parameter<object>) (object) param2(new RootParameterBuilder()).Build());
    }

不太重要,但如果您需要一些上下文,下面是Params的一些示例用法

代码语言:javascript
复制
        _dispatcher.On // IEventBuilder<IEvent>
            .Chat() // IEventBuilder<(IOrigin, string)>
            .Params( // IEventBuilder<(IOrigin, double)>
                p => p // IParameterBuilder<string>
                    .Transform(Convert.ToInt32) // IParameterBuilder<int>
                    .Transform(i => i + 128.0)) // IParameterBuilder<double>
            .Invoke(t =>
            {
                // t is (IOrigin, double)
            });
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-02 20:42:48

如果没有其他的帮助--创建Parameter类,那么移动(并调整)所有共享的功能,并从它继承Parameter<T>。在这种情况下,您可以移动Optional标志并调整ParseFunc:

代码语言:javascript
复制
public Func<string, object> ParseFuncUntyped {get; protected set;}

然后在Parameter<T>的构造函数中分配该函数,并将参数存储为Parameter

票数 3
EN

Stack Overflow用户

发布于 2017-11-02 13:46:05

Parameter<int>中存储Parameter<object>是不可能的。也就是说,如果您创建一个接口IParameter<T>并使其成为协变 (IParameter<out T>),那么您实际上可以将IParameter<int>存储在IParameter<object>中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47075144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档