2010-06-24 106 views
1

我有以下枚举定义如何在c#中使用switch组合中的枚举组合?

public enum UploaderType 
{ 
    BrandLogo = 0, 
    ReportingLogo = 1, 
    DocumentTemplate = 2, 
    MModalTemplate = 3, 
} 

我有,我想利用这个枚举

void FileUploadExceptionHandler(FileUploadControl.FileUploadExceptionType  exceptionType, FileUploadControl.UploaderType uploaderType) 
{ 
    switch (uploaderType) 
    { 
     case FileUploadControl.UploaderType.DocumentTemplate: 
      (this.Page as PageBase).SetMessage(string.Format(GetLocalResourceObject("FileExtensionError").ToString(), docIndentifier, formatAllowed(ucdocxUploadControl.SupportedFileTypes)), PageMessageType.ErrorMessage); 
      break; 
     case FileUploadControl.UploaderType.MModalTemplate: 
      (this.Page as PageBase).SetMessage(string.Format(GetLocalResourceObject("FileExtensionError").ToString(), docIndentifier, formatAllowed(ucampUploadControl.SupportedFileTypes)), PageMessageType.ErrorMessage); 
      break; 
     case FileUploadControl.UploaderType.MModalTemplate|FileUploadControl.UploaderType.DocumentTemplate: 
      (this.Page as PageBase).SetMessage(string.Format(GetLocalResourceObject("FileExtensionErrorForBoth").ToString(), formatAllowed(ucdocxUploadControl.SupportedFileTypes), formatAllowed(ucampUploadControl.SupportedFileTypes)), PageMessageType.ErrorMessage); 
      break; 
    } 
} 

我试图使用第三种情况,但是编译器枚举的组合开关的情况下投诉的标签'case 3:'已经出现在这个switch语句中。

此枚举不在我的控制范围之内,所以icann不使用标志。请建议如何实现这一点。

当我打电话吧,我用

FileUploadExceptionHandler(FileUploadControl.FileUploadExceptionType.FileExtensionNotAllowed, FileUploadControl.UploaderType.DocumentTemplate | FileUploadControl.UploaderType.MModalTemplate); 
+3

什么是你想真正实现?这不是一个标志枚举,并给定值,它不是设计用于组合的方式。 – 2010-06-24 09:49:00

+0

这是为单个文件上传而开发的,现在我上传了两个文件,并且在扩展名不匹配的情况下,我抛出了一个异常。当我调用它时,它并没有给出任何例外,但是UploaderType只保存最后一个值,即“MModalTemplate”。请参阅编辑。 – Rohit 2010-06-24 09:59:49

回答

1

你不能做你想做的。如果你能够修改枚举,你可以将它改为:

[Flags] 
public enum UploaderType 
{ 
    None = 0, 
    BrandLogo = 1, 
    ReportingLogo = 2, 
    DocumentTemplate = 4, 
    MModalTemplate = 8, 
} 

但是既然你不能改变它,那么你就无法做到。

0

每个案例可以有多个陈述。你可以这样做:

case FileUploadControl.UploaderType.DocumentTemplate: 
    (this.Page as PageBase).SetMessage(string.Format(GetLocalResourceObject("FileExtensionError").ToString(), docIndentifier, formatAllowed(ucdocxUploadControl.SupportedFileTypes)), PageMessageType.ErrorMessage); 
    break; 
case FileUploadControl.UploaderType.MModalTemplate: 
    (this.Page as PageBase).SetMessage(string.Format(GetLocalResourceObject("FileExtensionError").ToString(), docIndentifier, formatAllowed(ucampUploadControl.SupportedFileTypes)), PageMessageType.ErrorMessage); 
    (this.Page as PageBase).SetMessage(string.Format(GetLocalResourceObject("FileExtensionErrorForBoth").ToString(), formatAllowed(ucdocxUploadControl.SupportedFileTypes), formatAllowed(ucampUploadControl.SupportedFileTypes)), PageMessageType.ErrorMessage); 
    break; 
case FileUploadControl.UploaderType.DocumentTemplate: 
    (this.Page as PageBase).SetMessage(string.Format(GetLocalResourceObject("FileExtensionErrorForBoth").ToString(), formatAllowed(ucdocxUploadControl.SupportedFileTypes), formatAllowed(ucampUploadControl.SupportedFileTypes)), PageMessageType.ErrorMessage); 
    break; 
3

您可以使用落空:

switch(enum) 
{ 
    case MyEnum.First: 
    case MyEnum.Second: 
     // something 
     break; 
    case MyEnum.SomeThingElse: 
     break; 
} 
1

映射到一个新的enum与标志可能的帮助。

[Flags] 
public enum UploaderTypeNew 
{ 
    None = 0, 
    BrandLogo = 1, 
    ReportingLogo = 2, 
    DocumentTemplate = 4, 
    MModalTemplate = 8, 
} 

地图的旧enum每个值到新的enum和交换机上的新enum

0

既然你不能使用国旗,

(NModalTemplate | DocumentTemplate) == (2 | 3) == (3) == (NModalTemplate) 

在交换机最后一种情况是没有意义的,因为你不可能设置uploaderType这两个值在同一时间。

1

没有人认为这还没有,所以它可能是坏的,或者我可能不明白的问题,但我认为你可以使用这个goto

switch (uploaderType) 
{ 
    case FileUploadControl.UploaderType.DocumentTemplate: 
     (this.Page as PageBase).SetMessage(string.Format(GetLocalResourceObject("FileExtensionError").ToString(), docIndentifier, formatAllowed(ucdocxUploadControl.SupportedFileTypes)), PageMessageType.ErrorMessage); 
     break; 
    case FileUploadControl.UploaderType.MModalTemplate: 
     (this.Page as PageBase).SetMessage(string.Format(GetLocalResourceObject("FileExtensionError").ToString(), docIndentifier, formatAllowed(ucampUploadControl.SupportedFileTypes)), PageMessageType.ErrorMessage); 
     goto case FileUploadControl.UploaderType.MModalTemplate; 
    case FileUploadControl.UploaderType.DocumentTemplate: 
     (this.Page as PageBase).SetMessage(string.Format(GetLocalResourceObject("FileExtensionErrorForBoth").ToString(), formatAllowed(ucdocxUploadControl.SupportedFileTypes), formatAllowed(ucampUploadControl.SupportedFileTypes)), PageMessageType.ErrorMessage); 
     break; 
} 
+0

你可以,但当第二个命令覆盖第一个命令(都是SetMessage)时,它是没有意义的。 – pdr 2010-06-24 10:13:30

+0

是的,那当然是...... – Miel 2010-06-24 10:30:55