匿名類型為編譯器生成的內部類型,無法在方法參數/返回值中聲明。直接用 object 會失去強類型。
public T CastAnonymous(object anonymous, T anonymousType)
=> (T)anonymous;
// 使用
var anon = new { Age = 26, Name = "Lucifer", Flag = false };
Print(anon);
public void Print(object anonymous)
{
// 編譯器推斷 T 為匿名類型,保持強類型
var a = CastAnonymous(anonymous, new { Age = 0, Name = "", Flag = false });
Console.WriteLine($"{a.Age} - {a.Name} - {a.Flag}");
}
anonymousType 僅作為類型樣本,值不使用T 為對應匿名類型| 場景 | 可行性 | 建議 |
|---|---|---|
| 同程序集內部調用 | ✅ 完美 | 推薦用於內部輔助方法 |
| 跨程序集調用 | ❌ 失效 | 不同程序集同結構生成不同類型 |
| 公共 API 邊界 | ❌ 不推薦 | 映射到 Record/DTO 類型 |
| 動態場景 | ⚠️ 可用 dynamic | 失去編譯期檢查 |
// 定義明確類型
public record Person(int Age, string Name, bool Flag);
// 使用
var person = new Person(26, "Lucifer", false);
Print(person); // 完美強類型,跨程序集無障礙
void Print(Person p) => Console.WriteLine($"{p.Age} - {p.Name} - {p.Flag}");
泛型類型參數推斷技巧利用編譯器「同結構同類型」特性,實現匿名類型跨方法強類型傳遞。屬於進階內部技巧,生產代碼邊界請優先使用 record 或 class/struct 定義明確契約類型,保證可維護性與跨程序集兼容性。