如何在c#中使用switch组合中的枚举组合?
问题描述:
我有以下枚举定义如何在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);
答
你不能做你想做的。如果你能够修改枚举,你可以将它改为:
[Flags]
public enum UploaderType
{
None = 0,
BrandLogo = 1,
ReportingLogo = 2,
DocumentTemplate = 4,
MModalTemplate = 8,
}
但是既然你不能改变它,那么你就无法做到。
答
每个案例可以有多个陈述。你可以这样做:
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;
答
您可以使用落空:
switch(enum)
{
case MyEnum.First:
case MyEnum.Second:
// something
break;
case MyEnum.SomeThingElse:
break;
}
答
映射到一个新的enum
与标志可能的帮助。
[Flags]
public enum UploaderTypeNew
{
None = 0,
BrandLogo = 1,
ReportingLogo = 2,
DocumentTemplate = 4,
MModalTemplate = 8,
}
地图的旧enum
每个值到新的enum
和交换机上的新enum
。
答
既然你不能使用国旗,
(NModalTemplate | DocumentTemplate) == (2 | 3) == (3) == (NModalTemplate)
在交换机最后一种情况是没有意义的,因为你不可能设置uploaderType这两个值在同一时间。
答
没有人认为这还没有,所以它可能是坏的,或者我可能不明白的问题,但我认为你可以使用这个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;
}
什么是你想真正实现?这不是一个标志枚举,并给定值,它不是设计用于组合的方式。 – 2010-06-24 09:49:00
这是为单个文件上传而开发的,现在我上传了两个文件,并且在扩展名不匹配的情况下,我抛出了一个异常。当我调用它时,它并没有给出任何例外,但是UploaderType只保存最后一个值,即“MModalTemplate”。请参阅编辑。 – Rohit 2010-06-24 09:59:49