簡體   English   中英

C#工廠建設無法正常工作

[英]C# factory construction not working

我顯然在這里做錯了,但問題是如何使它正常工作? 我得到以下代碼

注意:ParameterEventStreamRef繼承自Parameter,StStvariants也是如此。

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

問題是:工廠正在返回正確的Converter,但是當調用該Converter時,它將“跳過” 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);
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM