2017-06-13 57 views
1

我用下面的命令来生成WCF服务代理类:如何在使用svcutils生成代理时保留一些自定义属性?

svcutil.exe" /out:C:\SomePath\.... /n:*,Internal.FooNameSpace 
    http://localhost/MyService.svc 

下面的类:

[ProtoContract] 
[ServiceContract] 
public class Foo 
{ 
    [ProtoMember(1)] 
    [DataMember(Order = 0)] 
    public string Bar { get; set; } 
} 

变为:

public partial class Foo : object, System.Runtime.Serialization.IExtensibleDataObject 
{    
     private string BarField; 

     [System.Runtime.Serialization.DataMemberAttribute()] 
     public string Bar 
     { 
      get 
      { 
       return this.BarField; 
      } 
      set 
      { 
       this.BarField = value; 
      } 
     }   
} 

有没有办法让生成的类的一些特定属性? (例如:在这种情况下为ProtoMember)。我当然可以破解代理,但会造成维护问题。

+0

你说得对,这不完全是生成的。匿名化我的代理服务器时,我犯了一些错误。我编辑了问题。 – tigrou

+0

我可能需要另一杯咖啡。感谢您的回答,我正在阅读。 – tigrou

+0

即将添加另一个选项... –

回答

1

如果您将该服务添加为服务引用,则不可以保留该信息 - 它只是不在WCF端点中。

IIRC,不过,WCF代码生成居然想出增量Order值,当你有多个属性 - 即一个属性会[System.Runtime.Serialization.DataMemberAttribute(Order = 1)],然后2等于是一个选择是不同文件(的partial class美容),定义(在相同的命名空间,等等)有关类型的附加信息:

[ProtoContract(DataMemberOffset = 1)] 
public partial class Foo { } 

这意味着:处理[DataMember]时,添加1每一个值 - 这意味着你应该得到所需的1,2,3,4 ...并且一切都会好起来的,你不必更改代码。

或者,你可以明确的:

[ProtoContract] 
[ProtoPartialMember(1, nameof(Foo.Bar))] 
[ProtoPartialMember(2, nameof(Foo.AnotherProp))] 
public partial class Foo { } 

这给你更多的灵活性,以指定有关属性的细微差别。

作为另一备选,可以在运行时配置的一切:

RuntimeTypeModel.Default.Add(typeof(Foo), false) 
    .Add(1, nameof(Foo.Bar)) 
    .Add(2, nameof(Foo.AnotherProp)); 
    // or AddField to get the ValueMember that you can use to set 
    // fine-grained control 

最后,你可以船数据合同的dll,并告诉svctil使用它已经包含了类型。您可以使用/reference:<file path>命令行开关执行此操作,或者在使用UI工具时可以使用类似功能(可以从可用的dll中进行选择)。


作为第二个“终于”(因为一个是不够的):你能描述数据,而不是作为一个.proto模式,只是告诉收件人做本地代码生成,并告诉SvcUtil工具将它排除在外( /excludeType:/reference:)。需要注意的是in progress rewrite of "protogen"目前包括[DataContract]/[DataMember]属性,但我能得到的是添加今天如果它是有用的。

+0

关于使用'DataMemberOffset'的解决方案:为了使它工作,我必须使用'[DataContract]'属性修饰部分类。只有'[ServiceContract]'它不起作用(串行器返回一个空的字节数组) – tigrou

+0

@tigrou够公平的;我认为(错误地看来)'Foo'已经被标记为'[DataContract]' –

相关问题