首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 3.0 匿名類型跨方法傳遞技巧:泛型類型參數推斷實現強類型訪問

     編輯:關於C語言

問題:匿名類型無法作為方法簽名類型

匿名類型為編譯器生成的內部類型,無法在方法參數/返回值中聲明。直接用 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失去編譯期檢查

現代替代方案:C# 9+ Record 類型


// 定義明確類型
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 定義明確契約類型,保證可維護性與跨程序集兼容性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved