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。我认为这样做的原因是一部分逻辑是在编译时完成的,另一部分是运行时。

C#工厂建设不起作用

在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);
    }