WCF.IList被反序列化为数组.如何使它成为任何可写列表(ArrayList)?

Ale*_*tov 5 c# wcf serialization

我有一个客户端 - 服务器应用程序,其中一部分通过WCF(netTcp绑定)相互"交谈".

我有我的DataContract,它有一个第三方类的字段:

[Serializable]
public class MyResult{
  public ThirdPartyResult Result {get;set;}

  /* other fields */
}
Run Code Online (Sandbox Code Playgroud)

使用反射我看到这个:

[Serializable]
public class ThirdPartyResult {
  private IList result;

  public IList Result
  { 
    get { return result ?? (result = new ArrayList());}
  }
}
Run Code Online (Sandbox Code Playgroud)

从客户端调用服务器时我有resultas ArrayList服务器.在客户端之后,该result字段变为固定大小的数组.

没有使用添加服务引用,但我使用程序集共享,只是这样做

ChannelFactory<IMyContract>.CreateChannel(new NetTcpBinding("Configuration.Name"), address);
Run Code Online (Sandbox Code Playgroud)

更新:服务合同

[ServiceContract]
[ServiceKnownType(typeof(ArrayList))]
[ServiceKnownType(typeof(ThirdPartyResult))]
public interface IMyContract
{
   MyResult GetResult();
}
Run Code Online (Sandbox Code Playgroud)

现在问题是:
我如何告诉WCF使用ArrayList而不是Array


我提出了一个非常糟糕的解决方案(从我的角度来看)
通常我希望ArrayList保留一个以便能够添加项目.最后我想出了下面的解决方案.是的,我知道,这是完全糟糕的,这就是为什么我还在寻找一些更好的变体.

        if (thirdParty.Results != null && thirdParty.Results.IsFixedSize)
        {
            var results = new ArrayList(thirdParty.Results);

            // Finding result by ReferenceEquals to not be tight to private variable name
            var resultsField = thirdParty.GetType()
                .GetFields(BindingFlags.Default | BindingFlags.Instance | BindingFlags.NonPublic)
                .Where(f => ReferenceEquals(f.GetValue(thirdParty), thirdParty.Results))
                .FirstOrDefault();

            if (resultsField != null)
                resultsField.SetValue(thirdParty, results);
        }
        thirdParty.AddResult(otherChild);
Run Code Online (Sandbox Code Playgroud)