C#工厂建设不起作用
本文关键字:不起作用 工厂 | 更新日期: 2023-09-27 18:25:43
我显然做错了什么,但问题是我如何让它工作?我得到了以下代码
注意:ParameterEventStreamRef继承自Parameter,StStvariations也是如此。
public void DoStuff(Parameter[] parameters)
{
var Parameters = parameters.Select(x => parameterConverterFactory.GetParameterConverter(x).ToJsonClass(x)).ToArray();
}
public class ParameterConverterFactory: IParameterConverterFactory
{
public IStackStateJsonConverter<StStParameter, Parameter> GetParameterConverter(StStParameter arg)
{
if (arg.GetType() == typeof(StStParameterEventStreamRef))
return new JsonParameterEventStreamRefConverter();
throw new InvalidEnumArgumentException(arg.GetType().FullName);
}
public class JsonParameterEventStreamRefConverter : JsonParameterConverter, IStackStateJsonConverter<StStParameterEventStreamRef, ParameterEventStreamRef>
{
public ParameterEventStreamRef ToJsonClass(StStParameterEventStreamRef arg, ParameterEventStreamRef source = null)
{
if (source == null)
source = new ParameterEventStreamRef();
base.ToJsonClass(arg, source);
source.var1 = arg.var1;
source.var2 = arg.var2;
return source;
}
}
public class JsonParameterConverter : JsonNodeConverter, IStackStateJsonConverter<StStParameter, Parameter>
{
public Parameter ToJsonClass(StStParameter arg, Parameter source = null)
{
if (source == null)
source = new Parameter();
source.var0 = arg.var0;
return source;
}
}
问题是:工厂正在返回正确的转换器,但当调用转换器时,它"跳过"JsonParameterEventStreamRefConverter并直接转到JsonParameterConverter。我认为这样做的原因是一部分逻辑是在编译时完成的,另一部分是运行时。
在DoStuff()中,您正在调用ToJsonClass()方法。即使"x"可以是Parameter的任何子代,运行时也不知道它是哪一个。它将查找与签名最匹配的ToJsonClass()签名:ToJsonClass(Parameter)。JsonParamterConverter有一个与此完全匹配的方法,因此这是最佳匹配。
您可以尝试用以下内容替换JsonParameterStreamRef中的ToJsonClass():
public override Parameter ToJsonClass(StStParameter arg, Parameter source = null)
{
if (arg.GetType() == typeof (StStParameterEventStreamRef))
{
return ToJsonClass(arg as StStParameterEventStreamRef, source as ParameterEventStreamRef);
}
return base.ToJsonClass(arg, source); // or throw an exception if this is an error.
}
以下是该问题的有效解决方案,但如果您能想出更好的解决方案,请。
public Parameter GetConverterFactory_AndDo_ToJsonClass(StStParameter stStParameter)
{
if (stStParameter.GetType() == typeof (StStParameterEventStreamRef))
return new JsonParameterEventStreamRefConverter().ToJsonClass(stStParameter as StStParameterEventStreamRef);
throw new InvalidEnumArgumentException(stStParameter.GetType().FullName);
}