gpt4 book ai didi

wcf - 我可以停止我的 WCF 生成 ArrayOfString 而不是 string[] 或 List

转载 作者:行者123 更新时间:2023-12-04 00:57:49 26 4
gpt4 key购买 nike

我在 WCF 服务代理方面遇到了一个小问题,其中消息包含 List<string>作为参数。

我在 Visual Studio 中使用“添加服务引用”来生成对我的服务的引用。

   // portion of my web service message
public List<SubscribeInfo> Subscribe { get; set; }
public List<string> Unsubscribe { get; set; }

这些是在我的 MsgIn 上生成的属性对于我的一种网络方法。
你可以看到它使用了 ArrayOfString当我使用 List<string> ,另一个需要 List<SubscribeInfo> - 与我上面的原始 C# 对象相匹配。
[System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false)]
public System.Collections.Generic.List<DataAccess.MailingListWSReference.SubscribeInfo> Subscribe {
get {
return this.SubscribeField;
}
set {
if ((object.ReferenceEquals(this.SubscribeField, value) != true)) {
this.SubscribeField = value;
this.RaisePropertyChanged("Subscribe");
}
}
}

[System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false)]
publicDataAccess.MailingListWSReference.ArrayOfString Unsubscribe {
get {
return this.UnsubscribeField;
}
set {
if ((object.ReferenceEquals(this.UnsubscribeField, value) != true)) {
this.UnsubscribeField = value;
this.RaisePropertyChanged("Unsubscribe");
}
}
}

生成的 ArrayOfString 类如下所示。这是在我的代码中生成的类 - 它不是 .NET 类。它实际上为我生成了一个从 List 继承的类,但没有为我创建任何构造函数的“体面”。
    [System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
[System.Runtime.Serialization.CollectionDataContractAttribute(Name="ArrayOfString", Namespace="http://www.example.com/", ItemName="string")]
[System.SerializableAttribute()]
public class ArrayOfString : System.Collections.Generic.List<string> {
}

问题是我经常像这样创建我的消息:
client.UpdateMailingList(new UpdateMailingListMsgIn()
{
Email = model.Email,
Name = model.Name,
Source = Request.Url.ToString(),
Subscribe = subscribeTo.ToList(),
Unsubscribe = unsubscribeFrom.ToList()
});

我真的很喜欢这给我的干净外观。

现在针对实际问题:

我无法分配 List<string>Unsubscribe属性是 ArrayOfString - 即使它继承自 List。事实上,如果没有额外的语句,我似乎无法找到任何分配它的方法。

我试过以下:
  • new ArrayOfString(unsubscribeFrom.ToList()) - 这个构造函数不存在:-(
  • 更改代码生成器使用的数组类型 - 不起作用 - 它总是给我 ArrayOfString (!?)
  • 尝试投 List<string>ArrayOfString - 因“无法转换”而失败,即使它编译得很好
  • 创建 new ArrayOfString()然后 AddRange(unsubscribeFrom.ToList()) - 有效,但我不能在一个声明中全部完成
  • 创建转换函数 ToArrayOfString(List<string>) ,这有效,但不像我想要的那么干净。

  • 它只对字符串执行此操作,这很烦人。

    我错过了什么吗?有没有办法告诉它不要生成 ArrayOfString - 或其他一些技巧来分配它?

    最佳答案

    任何实现名为“Add”的方法的 .NET 对象都可以像数组或字典一样进行初始化。

    由于 ArrayOfString 确实实现了“Add”方法,您可以像这样初始化它:

    var a = new ArrayOfString { "string one", "string two" };

    但是,如果你真的想基于另一个集合初始化它,你可以为此编写一个扩展方法:
    public static class U
    {
    public static T To<T>(this IEnumerable<string> strings)
    where T : IList<string>, new()
    {
    var newList = new T();
    foreach (var s in strings)
    newList.Add(s);
    return newList;
    }
    }

    用法:
    client.UpdateMailingList(new UpdateMailingListMsgIn()
    {
    Email = model.Email,
    Name = model.Name,
    Source = Request.Url.ToString(),
    Subscribe = subscribeTo.ToList(),
    Unsubscribe = unsubscribeFrom.To<ArrayOfString>()
    });

    关于wcf - 我可以停止我的 WCF 生成 ArrayOfString 而不是 string[] 或 List<string>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/505943/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com