我是否可以停止WCF生成ArrayOfString而不是string[]或List<;字符串>;

我是否可以停止WCF生成ArrayOfString而不是string[]或List<;字符串>;,wcf,Wcf,我对WCF服务代理有一个小问题,其中消息包含List作为参数 我正在使用Visual Studio中的“添加服务引用”生成对我的服务的引用 // portion of my web service message public List<SubscribeInfo> Subscribe { get; set; } public List<string> Unsubscribe { get; set; } 生成的ArrayOfString类如下所示。这是

我对WCF服务代理有一个小问题,其中消息包含
List
作为参数

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

   // portion of my web service message
   public List<SubscribeInfo> Subscribe { get; set; }
   public List<string> Unsubscribe { get; set; }
生成的ArrayOfString类如下所示。这是在我的代码中生成的类-它不是.NET类。它实际上为我生成了一个从列表继承的类,但并没有为我创建任何构造函数的“体面”

    [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> {
    }
我真的很喜欢这个给我的干净的外观

现在来看实际问题:

我无法将
List
分配给
Unsubscribe
属性,该属性是
ArrayOfString
——即使它从List继承。事实上,如果没有额外的语句,我似乎找不到任何方法来分配它

我尝试了以下方法:

  • 新建ArrayOfString(unsubscribfrom.ToList())
    -此构造函数不存在:-(
  • 更改代码生成器使用的数组类型-不起作用-它总是给我ArrayOfString(!?)
  • 尝试将
    List
    强制转换为
    ArrayOfString
    -失败,出现“无法强制转换”,即使它编译得很好
  • 创建
    newarrayofstring()
    ,然后
    AddRange(unsubscribed from.ToList())
    -可以工作,但我不能在一个语句中完成所有工作
  • 创建一个转换函数
    到ArrayOfstring(List)
    ,该函数可以工作,但没有我想要的那么干净
这只是为了字符串,这很烦人


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

如果您使用VS 2008来使用服务,那么有一个简单的解决方案

单击添加服务引用时显示的代理对话框上的“高级…”按钮。在“集合类型”下拉列表中,您可以选择System.Generic.List。方法返回列表现在应该可以正常工作


(希望这就是您所要求的,我有点累了,而且这个问题对我来说有点难理解。)

首先,我不希望跨服务边界返回泛型类型。相反,返回Unsubscribe作为
字符串[]
,SubscriptionInfo作为
SubscriptionInfo[]
。如有必要,可以轻松地将阵列转换为客户端上的常规列表,如下所示:

Unsubscribe = new List<string>(unsubscribeFrom);
Subscribe = new List<SubscriptionInfo>(subscribeTo);
Unsubscribe=新列表(取消订阅);
订阅=新列表(subscribeTo);

实现名为“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;
    }
}
公共静态类U
{
公共静态T到(此IEnumerable字符串)
其中T:IList,new()
{
var newList=newt();
foreach(字符串中的变量s)
新列表。添加(s);
返回newList;
}
}
用法:

client.UpdateMailingList(new UpdateMailingListMsgIn()
{
    Email = model.Email,
    Name = model.Name,
    Source = Request.Url.ToString(),
    Subscribe = subscribeTo.ToList(),
    Unsubscribe = unsubscribeFrom.To<ArrayOfString>()
});
client.updateEmailingList(新的updateEmailingListMsgin()
{
Email=model.Email,
Name=model.Name,
Source=Request.Url.ToString(),
Subscribe=subscribeTo.ToList(),
Unsubscribe=从.To()取消订阅
});

为时已晚,但可以在未来帮助人们

使用svcutil并显式通知命令行util您希望代理类由XmlSerializer而不是DataContractSerializer(默认)序列化。以下是示例:

svcutil/out:c:\Path\Proxy.cs/config:c:\Path\Proxy.config/async/serializer:XmlSerializer/namespace:*,YourNamespace


请注意,web服务是一个ASP.NET web服务好吗?!

我也累了!我一直在写太长的问题。如果不清楚,很抱歉。我想你已经理解了!不幸的是,你的建议不起作用-它坚持为字符串创建一个新的ArrayOfString类,不管我选择了什么!也许它会被弄糊涂了墨迹字符串是一种值类型?嗯。我必须测试它。不幸的是,我今天的工作日程安排有点繁忙。这本质上就是“服务引用”和“web引用”之间的区别吗?指定服务引用是否使用DataContractSerializer,而web引用是否使用XmlSerializer?请参阅
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>()
});