【C#】實體類定義的是long和值識別到的是Int64,實體類反射容易出現Object does not match target type

🌹歡迎來到《小5講堂》🌹
🌹這是《C#》系列文章,每篇文章將以博主理解的角度展開講解。🌹
🌹溫馨提示:博主能力有限,理解水平有限,若有不對之處望指正!🌹

在這里插入圖片描述

目錄

  • 前言
  • 數據類型
  • 重現報錯
  • C#開發小技巧
    • 1. 使用 `nameof` 運算符代替字符串
    • 2. 使用 `??` 和 `??=` 簡化空值檢查
    • 3. 模式匹配簡化類型檢查
    • 4. 使用 `using` 聲明簡化資源管理
    • 5. 字符串操作優化
    • 6. 集合初始化簡化
    • 7. 使用 `ValueTuple` 簡化多返回值
    • 8. 使用 `Span<T>` 提高性能
    • 9. 使用 `record` 類型簡化不可變對象
    • 10. 使用 `IAsyncEnumerable` 處理異步流
    • 11. 使用 `Null條件運算符` 安全訪問成員
    • 12. 使用 `本地函數` 封裝邏輯
    • 13. 使用 `switch表達式` 簡化條件判斷
    • 14. 使用 `全局using指令` (C# 10+)
  • 推薦文章

前言

一般使用成熟框架進行實體類轉換一般很少出現這種類型報錯的情況,突然出現這種報錯還是有點小疑惑。
經過排查發現,原來是前端傳遞過來的雪花ID值,控制器接收的前端傳遞過來的值,實體類在反射時數據類型變為其他,導致在獲取值時報錯,類型不匹配,一起來看看如何解決這個問題。

數據類型

剛開始以為是同一個實體類同一個字段數據類型問題,后來發現并不是,Int64和long是可以解析的,沒問題。
今天在改成昨天報錯的情況,發現沒有報錯了,驗證了Int64和long并不是報錯的關鍵,下面進行錯誤重現。

重現報錯

其實就是兩個不同實體類搞錯了,比如,反射了A實體類,卻獲取實體類B的值,這個時候就會提示報錯。
下面,創建一個實體類

public class TestModel
{public long ID { get; set; }public string Name { get; set; }
}public class TestModel2
{public long ID { get; set; }public string Name { get; set; }
}

反射代碼

var model = new TestModel();
model.ID = 1909528946437918720;
model.Name = "老張出場";var model2 = new TestModel();
model.ID = 1909528946437918721;
model.Name = "假冒老張";Type typeModel = typeof(TestModel);
PropertyInfo[] proModel = typeModel.GetProperties();
foreach (PropertyInfo pi in proModel)
{string dataType = pi.PropertyType.Name;string key = pi.Name;pi.GetValue(model2, null);
}

在這里插入圖片描述
在這里插入圖片描述

從上面就可以看到,小細節不注意的話,很容易把兩個看著相似的實體類搞混了,所以,在命名實體類時盡量要有差異,否則就容易出現上面的情況。

C#開發小技巧

以下是一些實用的 C# 開發技巧,可以提高你的編碼效率和代碼質量:

1. 使用 nameof 運算符代替字符串

// 舊方式
Console.WriteLine("變量名: " + "myVariable");
// 新方式
Console.WriteLine("變量名: " + nameof(myVariable));

優勢:重構友好,避免拼寫錯誤

2. 使用 ????= 簡化空值檢查

// 舊方式
string name = (value != null) ? value : "default";
// 新方式
string name = value ?? "default";// 舊方式
if (list == null) {list = new List<string>();
}
// 新方式
list ??= new List<string>();

3. 模式匹配簡化類型檢查

// 舊方式
if (obj is MyClass) {var myObj = (MyClass)obj;// 使用myObj
}
// 新方式
if (obj is MyClass myObj) {// 直接使用myObj
}// switch表達式
var result = obj switch {int i when i > 0 => "正數",int i when i < 0 => "負數",_ => "零或其他"
};

4. 使用 using 聲明簡化資源管理

// 舊方式
using (var stream = new FileStream(...))
{// 使用stream
}
// 新方式
using var stream = new FileStream(...);
// 使用stream
// 離開作用域時自動釋放

5. 字符串操作優化

// 字符串插值
var message = $"Hello, {name}! Today is {DateTime.Now:yyyy-MM-dd}";// 多行字符串
var json = """{"name": "John","age": 30}""";// 字符串拼接優化
var sb = new StringBuilder();
sb.Append("Hello");
sb.Append(" World");
var result = sb.ToString();

6. 集合初始化簡化

// 舊方式
var list = new List<int>();
list.Add(1);
list.Add(2);
list.Add(3);// 新方式
var list = new List<int> { 1, 2, 3 };// 字典初始化
var dict = new Dictionary<string, int> {["one"] = 1,["two"] = 2
};

7. 使用 ValueTuple 簡化多返回值

// 舊方式
public void GetValues(out int x, out int y) { ... }
// 調用
int x, y;
GetValues(out x, out y);// 新方式
public (int x, int y) GetValues() { ... }
// 調用
var (x, y) = GetValues();

8. 使用 Span<T> 提高性能

// 處理數組子集
var array = new int[100];
var slice = new Span<int>(array, 10, 20); // 引用array的10-30元素
foreach (ref int item in slice) {item *= 2;
}

9. 使用 record 類型簡化不可變對象

// 舊方式
public class Person {public string Name { get; }public int Age { get; }// 構造函數、Equals、GetHashCode等...
}// 新方式
public record Person(string Name, int Age);// 使用
var person = new Person("John", 30);
var newPerson = person with { Age = 31 }; // 不可變修改

10. 使用 IAsyncEnumerable 處理異步流

public async IAsyncEnumerable<int> GetNumbersAsync() {for (int i = 0; i < 10; i++) {await Task.Delay(100);yield return i;}
}// 使用
await foreach (var number in GetNumbersAsync()) {Console.WriteLine(number);
}

11. 使用 Null條件運算符 安全訪問成員

// 舊方式
if (person != null && person.Address != null) {var city = person.Address.City;
}
// 新方式
var city = person?.Address?.City;

12. 使用 本地函數 封裝邏輯

public void ProcessData(List<int> data) {// 本地函數int Square(int x) => x * x;var results = data.Select(Square).ToList();
}

13. 使用 switch表達式 簡化條件判斷

// 舊方式
string GetSizeDescription(int size) {if (size < 10) return "Small";else if (size < 20) return "Medium";else return "Large";
}// 新方式
string GetSizeDescription(int size) => size switch {< 10 => "Small",< 20 => "Medium",_ => "Large"
};

14. 使用 全局using指令 (C# 10+)

// 在項目文件中添加
<ItemGroup><Using Include="System.Linq" /><Using Include="System.Collections.Generic" />
</ItemGroup>
// 或者在GlobalUsings.cs中
global using System.Linq;
global using System.Collections.Generic;

這些技巧可以幫助你編寫更簡潔、更高效、更易維護的C#代碼。根據不同的C#版本,部分功能可能需要特定版本支持。

推薦文章

【C#】實體類定義的是long和值識別到的是Int64,實體類反射容易出現Object does not match target type

【C#】如果有一個數值如 168.0000100,如何去除末尾的無效零,只顯示有效的小數位數,讓DeepSeek給我們解答

【C#】Quartz.NET怎么動態調用方法,并且根據指定時間周期執行,動態配置類何方法以及Cron表達式,有請DeepSeek

【C#】.net core6.0無法訪問到控制器方法,直接404。由于自己的不仔細,出現個低級錯誤,這讓DeepSeek看出來了,是什么錯誤呢,來瞧瞧

【C#】Html轉Pdf,Spire和iTextSharp結合,.net framework 4.8

【C#】事務(進程 ID 64)與另一個進程被死鎖在鎖資源上,并且已被選作死鎖犧牲品。請重新運行該事務。不能在具有唯一索引“XXX_Index”的對象“dbo.Test”中插入重復鍵的行。

【C#】使用DeepSeek幫助評估數據庫性能問題,C# 使用定時任務,每隔一分鐘移除一次表,再重新創建表,和往新創建的表追加5萬多條記錄

【C#】合理使用DeepSeek相關AI應用為我們提供強有力的開發工具,在.net core 6.0框架下使用JsonNode動態解析json字符串,如何正確使用單問號和雙問號做好空值處理

【C#】已經實體類和動態實體類的反射使用方法,兩分鐘回顧,碼上就懂

【C#】使用vue3的axios發起get和post請求.net framework部署的API顯示跨域

【C#】.net core 6.0 webapi 使用core版本的NPOI的Excel讀取數據以及保存數據

【C#】pdf按頁分割文件,以及分頁合并,效果還不錯,你值得擁有

【C#】未能加載文件或程序集“CefSharp.Core.Runtime.dll”或它的某一個依賴項。找不到指定的模塊。

【C#】.net core 6.0 在program時間格式統一json格式化,并列舉program默認寫法和簡化寫法

【C#】.net core 6.0 ApiController,API控制器方法,API接口以實體類作為接收參數應該注意的點

【C#】 SortedDictionary,查找字典中是否存在給定的關鍵字

【C#】.net core 6.0 MVC返回JsonResult顯示API接口返回值不可被JSON反序列化

【C#】.net core 6.0 使用第三方日志插件Log4net,配置文件詳細說明

【C#】使用代碼實現龍年春晚撲克牌魔術(守歲共此時),代碼實現篇

【C#】使用代碼實現龍年春晚撲克牌魔術(守歲共此時),流程描述篇

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/89249.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/89249.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/89249.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C#獲取當前系統賬戶是否為管理員賬戶

傳統方式&#xff1a;WindowsPrincipal winPrincipal new WindowsPrincipal(WindowsIdentity.GetCurrent()); bool admin winPrincipal.IsInRole(WindowsBuiltInRole.Administrator);這種方式雖然是最常用的檢測管理員權限的方法&#xff0c;但是有個致命的缺陷&#xff0c;就…

【c++深入系列】:萬字詳解list(附模擬實現的list源碼)

&#x1f525; 本文專欄&#xff1a;c &#x1f338;作者主頁&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客勵志語錄&#xff1a; 當你覺得累的時候&#xff0c;說明你在走上坡路 ★★★ 本文前置知識&#xff1a; 模版 那么在之前的學習中&#xff0c;我們已經學習了…

PandaWiki與GitBook深度對比:AI時代的知識管理工具,選誰好?

在當今信息爆炸的時代&#xff0c;知識管理工具已成為個人學習、團隊協作和企業文檔管理的必需品。PandaWik作為AI時代迅速崛起的廣受歡迎知識管理平臺&#xff0c;代表了新一代AI驅動的知識庫系統。本文將從功能特性、技術架構、適用場景等多個維度進行全面對比分析。產品定位…

清除 Android 手機 SIM 卡數據的4 種簡單方法

SIM 卡存儲了聯系人、短信和通話記錄等信息。在更換新 SIM 卡之前&#xff0c;徹底清除舊卡上的所有個人數據&#xff08;如 SIM 卡聯系人、短信、通話記錄和手機號碼&#xff09;非常重要。要在 Android 手機上清除 SIM 卡內存&#xff0c;您可以參考以下方法。但在開始之前&a…

算法學習筆記:20.分治法——從原理到實戰,涵蓋 LeetCode 與考研 408 例題

分治法&#xff08;Divide and Conquer&#xff09;是計算機科學中最經典的算法設計思想之一&#xff0c;其核心思想是將復雜問題分解為若干個規模較小的子問題&#xff0c;通過解決子問題并合并結果來求解原問題。這種思想不僅在排序、搜索等基礎算法中廣泛應用&#xff0c;也…

@classmethod

1. 基本概念 classmethod 是 Python 中用于定義類方法的一種裝飾器。類方法與常規的實例方法不同&#xff0c;它的第一個參數是 cls&#xff0c;表示類本身&#xff0c;而不是實例。 class MyClass:class_attr "Class Attribute"classmethoddef class_method(cls):p…

Qt 中使用 SQLite 數據庫

一、SQLite 數據庫介紹 SQLite 是一個輕量級的嵌入式關系型數據庫管理系統&#xff0c;它以庫的形式提供&#xff0c;不需要單獨的服務器進程&#xff0c;直接訪問存儲在普通磁盤文件中的數據庫。 主要特性 無服務器架構&#xff1a;SQLite 不需要單獨的服務器進程 零配置&a…

【Unity】IL2CPP相關理論知識學習

一種編譯技術。優點&#xff1a;性能優化&#xff1a;IL2CPP生成C代碼后由本地編譯器優化&#xff0c;一般在CPU性能和GC方面都優于Mono。特別在移動端或主機平臺&#xff0c;性能差距更加明顯。跨平臺支持&#xff1a;Unity作為跨平臺引擎&#xff0c;IL2CPP是支持iOS、Androi…

一個用于在 Ubuntu 22.04.3 LTS 上顯示文件系統超級塊信息的 C 程序

1.程序#include <stdio.h> #include <sys/statvfs.h> #include <errno.h>int main(int argc, char *argv[]) {const char *path;struct statvfs fs_info;// 檢查參數if (argc ! 2) {fprintf(stderr, "用法: %s <掛載點或路徑>\n", argv[0]);…

Git未檢測到文件更改

背景 在本地倉庫改動文件發現git檢測不到修改了的文件&#xff0c;安裝有Git狀態可視化工具&#xff0c;文件改動后應該是紅色標記&#xff0c;但是仍然是綠色的 git status&#xff0c;git diff等也都沒有顯示文件改動 原因 1.可能是文件命中了.gitignore文件過濾條件 檢查后發…

Golang學習之常見開發陷阱完全手冊

1. 指針的“溫柔陷阱”&#xff1a;空指針與野指針的致命一擊Go語言的指針雖然比C/C簡單&#xff0c;但照樣能讓你“痛不欲生”。新手常覺得Go的指針“安全”&#xff0c;但真相是&#xff1a;Go并不會幫你完全規避指針相關的Bug。空指針&#xff08;nil pointer&#xff09;和…

【python】sys.executable、sys.argv、Path(__file__) 在PyInstaller打包前后的區別

文章目錄sys.executable 的區別打包前打包后sys.argv 的區別打包前打包后Path(__file__) 的區別打包前打包后應用場景與解決方案總結在使用 PyInstaller 將 Python 腳本打包為獨立可執行文件時&#xff0c; sys.executable、 sys.argv 和 Path(__file__) 的行為會發生變化。理…

JWT基礎詳解

JSON Web Token 簡稱JWT 一、起源&#xff1a; 這一切的起源都源于網景公司的一個天才程序員&#xff0c;為了解決http協議無狀態問題&#xff0c;就讓瀏覽器承擔了一部分“記憶”責任&#xff08;每次客戶端&#xff0c;訪問服務器&#xff0c;自身就攜帶cookie&#xff0c;…

【Unity】MiniGame編輯器小游戲(十四)基礎支持模塊(游戲窗口、游戲對象、物理系統、動畫系統、射線檢測)

更新日期:2025年7月15日。 項目源碼:獲取項目源碼 索引 基礎支持模塊一、游戲窗口 MiniGameWindow1.窗體屬性2.快速退出鍵3.模擬幀間隔時間4.生命周期函數5.游戲狀態二、游戲對象 MiniGameObject1.位置2.激活狀態3.碰撞器4.限制游戲對象的位置5.生命周期函數6.移動三、物理系…

Swift6.0 - 5、基本運算符

目錄1、術語2、賦值運算符&#xff08;a b&#xff09;3、算術運算符&#xff08;、-、*、/&#xff09;3.1、余數運算符&#xff08;%&#xff09;3.2、一元負號運算符&#xff08;-a&#xff09;3.3、一元正號運算符&#xff08;a&#xff09;4、復合賦值運算符&#xff08;…

DataWhale AI夏令營 Task2.2筆記

本次代碼改進主要集中在聚類算法和主題詞提取方法的優化上&#xff0c;主要包含三個關鍵修改&#xff1a;首先&#xff0c;將聚類算法從KMeans替換為DBSCAN。這是因為原KMeans方法需要預先指定聚類數量&#xff0c;而實際評論數據中的主題分布難以預測。DBSCAN算法能夠自動確定…

自啟動策略調研

廣播攔截策略1.流程圖廣播發送├─ 特權進程&#xff08;Root/Shell&#xff09; → 放行├─ 系統進程&#xff08;UID≤1000&#xff09; → 自動啟動校驗 → 非法廣播&#xff1f; → 攔截│ ├─ 黑名單匹配 → 攔截│ └─ 用戶/白名單校驗 → 受限用戶&#xff1f; →…

MFC/C++語言怎么比較CString類型最后一個字符

文章目錄&#x1f527; 1. 直接下標訪問&#xff08;高效首選&#xff09;&#x1f50d; 2. ReverseFind 反向定位&#xff08;語義明確&#xff09;?? 3. Right 提取子串&#xff08;需臨時對象&#xff09;?? 4. 封裝工具函數&#xff08;推薦健壯性場景&#xff09;??…

【Cortex-M】異常中斷時的程序運行指針SP獲取,及SCB寄存器錯誤類型獲取

【Cortex-M】異常中斷時的程序運行指針SP獲取&#xff0c;及SCB寄存器錯誤類型獲取 更新以gitee為準&#xff1a; gitee 文章目錄異常中斷異常的程序運行指針SP獲取SCB寄存器錯誤類型獲取硬件錯誤異常 Hard fault status register (SCB->HFSR)存儲器管理錯誤異常 SCB->C…

項目流程管理系統使用建議:推薦13款

本文分享了13款主流的項目流程管理系統&#xff0c;包括&#xff1a;1.PingCode&#xff1b;2.Worktile&#xff1b;3.泛微 E-Office&#xff1b;4.Microsoft Project&#xff1b;5.簡道云&#xff1b;6.Zoho Projects&#xff1b;7.Tita 項目管理&#xff1b;8.Oracle Primave…