当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《我可以阻止我的WCF生成ArrayOfString而不是string[]或List<string>》经验,为你挑选了1个好方法。

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

我在Visual Studio中使用"添加服务引用"来生成对我的服务的引用.

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

这些是我MsgIn的一个Web方法的生成属性.你可以看到它ArrayOfString在我使用时使用List,而另一个需要List- 它匹配我上面的原始C#对象.

[System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false)]
public System.Collections.Generic.List 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的类,但没有'decency'来创建任何构造函数.

    [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 {
    }

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

client.UpdateMailingList(new UpdateMailingListMsgIn()
{
    Email = model.Email,
    Name = model.Name,
    Source = Request.Url.ToString(),
    Subscribe = subscribeTo.ToList(),
    Unsubscribe = unsubscribeFrom.ToList()
});

我真的很喜欢这给我带来的干净外观.

现在针对实际问题:

我不能分配ListUnsubscribe这是一个属性ArrayOfString -即使它从名单继承.事实上,我似乎无法找到任何方式来分配它没有额外的声明.

我尝试过以下方法:

new ArrayOfString(unsubscribeFrom.ToList()) - 这个构造函数不存在:-(

更改代码生成器使用的数组的类型 - 不起作用 - 它总是给我ArrayOfString(!?)

尝试投ListArrayOfString -失败,"无法投",尽管它编译就好了

创造new ArrayOfString()然后AddRange(unsubscribeFrom.ToList()) - 工作,但我不能在一个声明中做到这一切

创建一个转换函数ToArrayOfString(List),它可以工作,但不是我想要的干净.

它只为字符串做这个,这很烦人.

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



1> Fábio Batist..:

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

由于ArrayOfString实现了"添加"方法,您可以像这样初始化它:

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

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

public static class U
{
    public static T To(this IEnumerable strings)
        where T : IList, 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()
});

推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有