類型轉送可讓您將類型移至另一個元件,而不需要重新編譯使用原始元件的應用程式。
例如,假設應用程式在名為 Example 的元件中使用 類別。
Utility.dll 的開發人員可能會決定重構元件,而且在這個過程中,他們可能會將 Example 類別移至另一個元件。 如果舊版的Utility.dll 取代為新版本的Utility.dll 及其隨附元件,則使用 Example 類別的應用程式會失敗,因為它無法在新版本Example中找到 類別。
Utility.dll 的開發人員可以避免這種情況,方法是使用 Example 屬性來轉送 TypeForwardedToAttribute 類別的要求。 如果屬性已被套用到新的版本 Utility.dll上,針對 Example 類別的請求會轉送至現在包含該類別的元件。 現有的應用程式會繼續正常運作,而不需重新編譯。
轉寄類型
轉送類型有四個步驟:
將型別的源代碼從原始組件移至目的地組件。
在原本放置型別的元件中,為已移動的型別新增 TypeForwardedToAttribute 。 下列程式代碼顯示已移動之類型
Example的屬性。[assembly:TypeForwardedToAttribute(Example::typeid)][assembly:TypeForwardedToAttribute(typeof(Example))]現在包含該型別的元件進行編譯。
重新編譯曾經包含型別的元件,並參考現在包含該型別的元件。 例如,如果您要從命令行編譯 C# 檔案,請使用 References (C# 編譯程式選項) 選項來指定包含類型的元件。 在 C++ 中,使用來源檔案中的 #using 指示詞來指定包含類型的元件。
C# 類型轉送範例
從上述已嘗試的範例描述繼續,假設您正在開發 Utility.dll,而且您有一個 Example 類別。
Utility.csproj 是基本類別庫:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsing>true</ImplicitUsing>
</PropertyGroup>
</Project>
類別 Example 提供一些屬性並覆寫 Object.ToString:
using System;
namespace Common.Objects;
public class Example
{
public string Message { get; init; } = "Hi friends!";
public Guid Id { get; init; } = Guid.NewGuid();
public DateOnly Date { get; init; } = DateOnly.FromDateTime(DateTime.Today);
public sealed override string ToString() =>
$"[{Id} - {Date}]: {Message}";
}
現在,假設有使用中的專案,並在 Consumer 元件中表示。 此消耗項目會參考 實用工具 程式集。 例如,它會具現化 物件, Example 並將其寫入主控台的 Program.cs 檔案中:
using System;
using Common.Objects;
Example example = new();
Console.WriteLine(example);
當取用的應用程式執行時,它會輸出物件的狀態 Example 。 此時,沒有任何類型轉送,因為 Consuming.csproj 參考 Utility.csproj。 不過,公用程式 元件的開發人員決定將 Example 物件移除作為重構的一部分。 此類型會移至新建立的 Common.csproj。
藉由從 公用程式 元件中移除此類型,開發人員會引進重大變更。 所有取用項目都會在更新至最新的 公用程式 元件時中斷。
您可以將類型轉發,而不是要求取用專案將新的參考新增至 Common 組件。 由於此類型已從公用程式元件中移除,因此您必須讓Utility.csproj參考 Common.csproj:
<ItemGroup>
<ProjectReference Include="..\Common\Common.csproj" />
</ItemGroup>
上述 C# 專案現在會參考新建立的 Common 元件。 這可以是 PackageReference 或 ProjectReference。
公用程式元件必須提供型別轉送資訊。 依照慣例類型轉送宣告通常會封裝在名為 TypeForwarders的單一檔案中,請考慮公用程式元件中的下列TypeForwarders.cs C# 檔案:
using System.Runtime.CompilerServices;
using Common.Objects;
[assembly:TypeForwardedTo(typeof(Example))]
公用程式元件會參考 Common 元件,並轉送Example類型。 如果您要使用型別轉送宣告來編譯 公用程式 元件,並將 Utility.dll 放入 取用的二進位相容目錄,則取用的應用程式將不需編譯即可運作。