[英]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.