我正在尝试创建一个WCF服务,其中一些枚举器公开给客户端以在类对象上设置某些属性 . 与不同操作关联的所有枚举器都放在一个单独的类中 .

阅读一些文章后我理解的是,如果,在WCF服务的客户端可以访问枚举器,

  • 枚举器在单独的DataContract中声明 . 对于我的情况,问题是我无法让客户端根据类的设计方式调用枚举器,如 ClassName.Enum.Value . 由于某种原因,生成的wsdl将类名和枚举名称组合为单个名称,如枚举器的 ClassNameEnumName ,需要像 Namespace.ClassNameEnumName 一样进行访问 .

  • 枚举类型的属性在包含枚举数的类中声明 . 这种方法的问题在于,我不需要这个属性,但这是我可以通过客户端上的代理生成器按预期识别并包含在代理类中的唯一方法,以便它可以像 ClassName.Enum.Value 一样使用 . 另一个问题是它将这些属性暴露给客户端,因为它需要用 [DataMember] 进行修饰 . 我希望客户永远不会看到这些,因为客户永远不需要使用它 . 我不知道如何在没有显示支持属性的情况下只公开枚举器,以便可以像_2574388那样使用它 .

我的理解是,如果没有DataMember的显式实例,声明的对象永远不会在生成的代理类中定义 . 在我的情况下,我通过创建属性创建类似下面的模拟代码中的属性来实现它,但我担心这会引入不需要的DataMembers(如 EnumErrTypeErrType )暴露给客户端 .

所以问题是,如何在类中声明一个枚举器供客户端使用,可以像_2574391那样使用,而不必暴露支持属性,甚至不首先创建一个 .

[DataContract]
public class ErrorTransaction
{
    [DataMember]
    public ICollection<Error> Errors { get; set; }
}

[DataContract]
public class Error
{
    [DataMember]
    public EnumErrorType EnumErrType { get; set;  }

    [DataMember]
    public int id { get; set; }

    [DataMember]
    public ErrXYZ.EnumErrorType Type { get; set; }

    [DataMember]
    public DateTime Date { get; set; }
}

public class ErrXYZ
{
    [DataMember]
    public EnumErrorType ErrType { get; set;  }

    public enum EnumErrorType : int
    {
        [EnumMember]
        errType1 = 1,

        [EnumMember]
        errType2 = 2,

        [EnumMember]
        errType3 = 3
    }
}