| 形式 | 代碼量 | 靈活性 | 典型適用場景 |
|---|---|---|---|
| 常規屬性 | 最多 | 最強(get/set 可含邏輯、驗證、計算) | 需要封裝邏輯、延遲計算、權限控制、序列化自定義等 |
| 自動實現屬性 | 最少(僅 get; set;) | 中等(無法在存取器中加邏輯) | 單純數據容器、DTO、實體類、無額外驗證需求 |
| 字段 | 最少 | 最弱(直接讀寫,無攔截點) | 內部實現細節、高性能熱路徑、無需封裝的私有狀態 |
當兩個系統實體類屬性部分重疊、數量較大時,手工賦值極其繁瑣。利用常規屬性的反射特性,可通用複製:
// 轉換公共屬性
PropertyInfo[] proAs = src.GetType().GetProperties();
PropertyInfo[] proBs = dst.GetType().GetProperties();
if (proAs != null && proBs != null)
{
foreach (var proA in proAs)
{
if (!proA.CanRead) continue;
foreach (var proB in proBs)
{
if (proB.Name.Equals(proA.Name, StringComparison.OrdinalIgnoreCase)
&& proB.PropertyType == proA.PropertyType
&& proB.CanWrite)
{
proB.SetValue(dst, proA.GetValue(src, null), null);
}
}
}
}
優勢:屬性提供 CanRead/CanWrite、類型檢查、存取器邏輯執行等反射元數據,字段無法做到。
private)。