Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF确保存在必要的枚举值_C#_Wcf_Serialization_Enums - Fatal编程技术网

C# WCF确保存在必要的枚举值

C# WCF确保存在必要的枚举值,c#,wcf,serialization,enums,C#,Wcf,Serialization,Enums,我正在尝试序列化可能还不存在的枚举值。 我有一个现有的项目,在我们的datacontract中有几个枚举,为了简单起见,我显示了一个这样的枚举: public partial class TestDTO : ITestDTO { public DeleteMe DeleteMeEnum { get; set; } } [DataContract] public enum DeleteMe { [EnumMember] Deleted = 0, } 我们的应用程序有一

我正在尝试序列化可能还不存在的枚举值。 我有一个现有的项目,在我们的datacontract中有几个枚举,为了简单起见,我显示了一个这样的枚举:

public partial class TestDTO : ITestDTO
{
    public DeleteMe DeleteMeEnum { get; set; }
}

[DataContract]
public enum DeleteMe 
{
    [EnumMember]
    Deleted = 0,
}
我们的应用程序有一个隐藏的内部wcf层,我们的公共web api可以访问该层。示例服务合同如下所示:

[ServiceContract]
public interface ITestService
{
    [OperationContract]
    TestDTO GetTestDTO();
}

public class TestService : ITestService
{
    public TestDTO GetTestDTO()
    {
        return new TestDTO() { DeleteMeEnum = (DeleteMe)2 };
    }
}
当我从WebApi调用此方法时,显然会出现经典错误:

枚举值“2”对于类型“DeleteMe”无效,无法序列化。如果类型具有DataContractAttribute属性,请确保存在必要的枚举值,并使用EnumMemberAttribute属性进行标记

我现在不能去更改所有的枚举,因为我们有一个庞大的项目,替换它们太多了,用新的Attibute替换我们所有的服务合同也太多了


有人知道我可以全局解决这个问题的方法吗,比如用自定义的XMLSerializer替换默认的XMLSerializer?

一旦应用程序发布,就没有好的方法来处理这个问题。然而,如果你提前计划好情况,它是可以处理的

因此,对于上面的示例,您可以这样做:

public partial class TestDTO : ITestDTO
{
    [DataMember(Name = "DeleteMeEnum")]
    private string DeleteMeEnumString 
    {
         get { return DeleteMeEnum.ToString(); }
         set {
              DeleteMe _enum;
              if (!Enum.TryParse(value, out _enum))
              {
                  _enum = <default value>;
              }
              DeleteMeEnum = _enum;
         }
    }   

    [IgnoreDataMember]
    public DeleteMe DeleteMeEnum { get; set; }
}
公共部分类TestDTO:ITestDTO
{
[DataMember(Name=“DeleteMeEnum”)]
私有字符串DeleteMeEnumString
{
获取{return DeleteMeEnum.ToString();}
设置{
DeleteMe _enum;
如果(!Enum.TryParse(值,out_Enum))
{
_枚举=;
}
DeleteMeEnum=_enum;
}
}   
[IgnoreDataMember]
public DeleteMe DeleteMeEnum{get;set;}
}

一旦应用程序发布,就没有好的方法来处理这个问题。然而,如果你提前计划好情况,它是可以处理的

因此,对于上面的示例,您可以这样做:

public partial class TestDTO : ITestDTO
{
    [DataMember(Name = "DeleteMeEnum")]
    private string DeleteMeEnumString 
    {
         get { return DeleteMeEnum.ToString(); }
         set {
              DeleteMe _enum;
              if (!Enum.TryParse(value, out _enum))
              {
                  _enum = <default value>;
              }
              DeleteMeEnum = _enum;
         }
    }   

    [IgnoreDataMember]
    public DeleteMe DeleteMeEnum { get; set; }
}
公共部分类TestDTO:ITestDTO
{
[DataMember(Name=“DeleteMeEnum”)]
私有字符串DeleteMeEnumString
{
获取{return DeleteMeEnum.ToString();}
设置{
DeleteMe _enum;
如果(!Enum.TryParse(值,out_Enum))
{
_枚举=;
}
DeleteMeEnum=_enum;
}
}   
[IgnoreDataMember]
public DeleteMe DeleteMeEnum{get;set;}
}

是否已使用
[DataMember]标记枚举的每个实例
attribute?@ste-fu我正在尝试序列化成员,这些成员是不存在的枚举的值表示抱歉-我有点困惑-您如何期望强制转换到不存在的值才能完全停止?@ste-fu c#允许将任何基于int的枚举强制转换为int值枚举,因此,我希望重写序列化程序以将所有枚举强制转换为其int值,并且当它们被反序列化时,它们会被强制转换回枚举(在本例中是这样的)(DeleteMe)2如果要接受未知值,为什么还要使用枚举?如果您需要使枚举中的管理更改更容易的话,那么请考虑。您是否使用<代码>标记了EnUM的每个实例[DATAMEMPON]?attribute?@ste-fu我正在尝试序列化成员,这些成员是不存在的枚举的值表示抱歉-我有点困惑-您如何期望强制转换到不存在的值才能完全停止?@ste-fu c#允许将任何基于int的枚举强制转换为int值枚举,因此,我希望重写序列化程序以将所有枚举强制转换为其int值,并且当它们被反序列化时,它们会被强制转换回枚举(在本例中是这样的)(DeleteMe)2如果要接受未知值,为什么还要使用枚举?如果你需要一些东西来简化枚举的管理变化,那么就考虑一下。