首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以停止我的WCF生成ArrayOfString而不是string[]或List<string>

我可以停止我的WCF生成ArrayOfString而不是string[]或List<string>
EN

Stack Overflow用户
提问于 2009-02-03 03:35:37
回答 4查看 15.6K关注 0票数 12

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

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

代码语言:javascript
复制
   // portion of my web service message
   public List<SubscribeInfo> Subscribe { get; set; }
   public List<string> Unsubscribe { get; set; }

这些是在我的MsgIn上为我的一个web方法生成的属性。当我使用ArrayOfString时,您可以看到它使用了List<SubscribeInfo>,而另一个使用的是List<SubscribeInfo>,它与上面的原始C#对象相匹配。

代码语言:javascript
复制
[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,但没有创建任何构造函数的‘体面’。

代码语言:javascript
复制
    [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> {
    }

问题是,我经常这样创建我的信息:

代码语言:javascript
复制
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 )失败,尽管它编译了精细的
  • create new ArrayOfString(),然后< code >D24 -工作,但是我不能在一个statement
  • create中完成所有转换函数<>D27,这是可行的,但没有我想要的那么干净。

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

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-03-12 19:08:47

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

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

代码语言:javascript
复制
var a = new ArrayOfString { "string one", "string two" };

但是,如果您真的想根据另一个集合初始化它,可以为此编写一个扩展方法:

代码语言:javascript
复制
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;
    }
}

用法:

代码语言:javascript
复制
client.UpdateMailingList(new UpdateMailingListMsgIn()
{
    Email = model.Email,
    Name = model.Name,
    Source = Request.Url.ToString(),
    Subscribe = subscribeTo.ToList(),
    Unsubscribe = unsubscribeFrom.To<ArrayOfString>()
});
票数 7
EN

Stack Overflow用户

发布于 2009-03-06 07:54:27

首先,我不喜欢跨服务边界返回泛型类型。相反,返回退订为string[],SubscriptionInfo返回为SubscriptionInfo[]。如果有必要,可以轻松地将数组转换为客户端上的通用列表,如下所示:

代码语言:javascript
复制
Unsubscribe = new List<string>(unsubscribeFrom);
Subscribe = new List<SubscriptionInfo>(subscribeTo);
票数 3
EN

Stack Overflow用户

发布于 2011-04-19 22:07:01

太晚了,但能在未来帮助人们.

使用svcutil,并显式地通知命令行util,您希望代理类由XmlSerializer而不是DataContractSerializer序列化(默认)。这是样品:

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/505943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档