我需要将Build()返回的Build()存储为一个Parameter<object> (因为我将参数存储在一个数组中,另一种方法就是对每个参数都粘贴相同的类,因为c#没有可变的泛型)。
问题在于cast (Parameter<object>) (object) (/* value of type Parameter<int> */);,因为int并不适用于object。我该如何解决这个问题?
我有以下怪物(假设T1是int):
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的一些示例用法
_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)
});发布于 2017-11-02 20:42:48
如果没有其他的帮助--创建Parameter类,那么移动(并调整)所有共享的功能,并从它继承Parameter<T>。在这种情况下,您可以移动Optional标志并调整ParseFunc:
public Func<string, object> ParseFuncUntyped {get; protected set;}然后在Parameter<T>的构造函数中分配该函数,并将参数存储为Parameter
发布于 2017-11-02 13:46:05
在Parameter<int>中存储Parameter<object>是不可能的。也就是说,如果您创建一个接口IParameter<T>并使其成为协变 (IParameter<out T>),那么您实际上可以将IParameter<int>存储在IParameter<object>中。
https://stackoverflow.com/questions/47075144
复制相似问题