C# — Enum & Switch

Conrad
Conrad KU
Published in
5 min readJun 16, 2023
Photo by Fernando Hernandez on Unsplash

前言

當前端有 radio 選項時後端可以用 Enum 來避免 Magic Number

參考文章:[C#] 使用 Enum 避免 Magic Number

🔖 文章索引

1. 前端
2. 後端
3. 總結

前端

radio name="images" value=" 1 | 2 | 3 "

<form style="width: 500px" class="pt-3 pb-4">
<div class="mb-3">
<div class="mb-0 h5 d-flex align-items-center">
<div>選擇圖片:</div>
<div style="flex-basis: 65px; line-height: 30px;">
<input class="form-check-input" type="radio" name="images" id="img_one" value="1" checked>
<label class="form-check-label" for="img_one">
img_one
</label>
</div>
<div style="flex-basis: 105px; line-height: 30px;">
<input class="form-check-input" type="radio" name="images" id="img_two" value="2">
<label class="form-check-label" for="img_two">
img_two
</label>
</div>
<div style="line-height: 30px;">
<input class="form-check-input" type="radio" name="images" id="img_three" value="3">
<label class="form-check-label" for="img_three">
img_three
</label>
</div>
</div>
</div>
<button type="submit" id="confirmBtn" class="btn btn-info w-100">確定</button>
</form>
const confirmBtn = document.getElementById('confirmBtn') as HTMLButtonElement;
const images = document.getElementsByName("images");

confirmBtn.addEventListener('click', function(e) {
e.preventDefault();
let images_checked = "0";

images.forEach((element) => {
if ( (element as HTMLInputElement).checked ) {
images_checked = (element as HTMLInputElement).value;
}
})

if (!images_checked) {
alert("請選擇圖片");
return;
}

const formData = new FormData();
formData.append('image', images_checked);

// axios.post("/Home/Index", data)
callApiPostHomeIndex(formData);
})


後端

使用 switch ( Value )Value 要和 case enum 型別 比對時

要將 Value 的類別強制轉成 enum 型別

public enum Images
{
One = 1,
Two,
Three
}

public class HomeController : Controller
{
...

[HttpPost]
public IActionResult Images(IFormCollection formCollection)
{
try
{
if (!Int32.TryParse(formCollection["image"], out int image))
{
return BadRequest(new ErrorResponse() { Message = "圖片選項不在範圍內" });
}

// Error
// switch( image )
// {
// Error: Cannot convert expression of type "ProjectName.Controllers.Images" to type 'int'
// case Images.One:
// break;
// }

// Success
switch ( (Images)image )
{
case Images.One:
...
break;
case Images.Two:
...
break;

...
}
}
catch (Exception e)
{
...
}
}
}

總結

當看到 Error: Cannot convert expression of type "ProjectName.Controllers.EnumName" to type 'int' 我沒有想到 Enum 也會是一個型別,所以一直沒想到用強轉型別的方式,經過這次以後看到錯誤訊息就會多了對於型別的敏銳度 👏

--

--

Conrad
Conrad KU

Remember, happiness is a choice, so choose to be happy.