Bagikan melalui


Penerusan tipe dalam Common Language Runtime

Penerusan jenis memungkinkan Anda memindahkan jenis ke rakitan lain tanpa harus mengkombinasikan ulang aplikasi yang menggunakan rakitan asli.

Misalnya, aplikasi menggunakan Example kelas dalam rakitan bernama Utility.dll. Pengembang Utility.dll mungkin memutuskan untuk mengubah susunan perakitan, dan dalam prosesnya mereka mungkin memindahkan kelas ke perakitan lain. Jika versi lama Utility.dll digantikan oleh versi baru Utility.dll dan rakitan pendampingnya, aplikasi yang menggunakan Example kelas gagal karena tidak dapat menemukan Example kelas dalam versi baru Utility.dll.

Pengembang Utility.dll dapat menghindari hal ini dengan meneruskan permintaan untuk Example kelas, menggunakan TypeForwardedToAttribute atribut . Jika atribut telah diterapkan pada versi baru Utility.dll, permintaan untuk Example dialihkan ke rakitan yang kini berisi kelas tersebut. Aplikasi yang ada terus berfungsi secara normal, tanpa kompilasi ulang.

Meneruskan tipe

Ada empat langkah untuk meneruskan jenis:

  1. Pindahkan kode sumber untuk jenis dari rakitan asli ke rakitan tujuan.

  2. Pada rakitan di mana jenis tersebut sebelumnya berada, tambahkan TypeForwardedToAttribute untuk jenis yang dipindahkan. Kode berikut menunjukkan atribut untuk jenis bernama Example yang dipindahkan.

     [assembly:TypeForwardedToAttribute(Example::typeid)]
    
     [assembly:TypeForwardedToAttribute(typeof(Example))]
    
  3. Kompilasi perakitan yang sekarang mengandung tipe tersebut.

  4. Kompilasi ulang assembly tempat tipe sebelumnya berada, dengan merujuk ke assembly yang sekarang berisi tipe tersebut. Misalnya, jika Anda mengkompilasi file C# dari baris perintah, gunakan opsi Referensi (opsi pengkompilasi C#) untuk menentukan rakitan yang berisi jenis. Di C++, gunakan direktif #using dalam file sumber untuk menentukan rakitan yang berisi jenis .

Contoh penerusan tipe C#

Melanjutkan dari deskripsi contoh di atas, bayangkan Anda sedang mengembangkan Utility.dll, dan Anda memiliki kelas Example. Utility.csproj adalah pustaka kelas dasar:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsing>true</ImplicitUsing>
  </PropertyGroup>

</Project>

Kelas Example menyediakan beberapa properti dan mengganti 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}";
}

Sekarang, bayangkan bahwa ada sebuah proyek konsumsi yang diwakili oleh perakitan Konsumen. Proyek ini mereferensikan modul Utilitas. Sebagai contoh, ini menginstansiasi objek Example dan menuliskannya ke konsol dalam file Program.cs:

using System;
using Common.Objects;

Example example = new();

Console.WriteLine(example);

Saat aplikasi konsumen berjalan, aplikasi akan menampilkan status objek Example tersebut. Pada titik ini, tidak ada penerusan jenis karena Consuming.csproj mereferensikan Utility.csproj. Namun, pengembang assembly Utility memutuskan untuk menghapus Example objek sebagai bagian dari pemfaktoran ulang. Jenis ini dipindahkan ke Common.csproj yang baru dibuat.

Dengan menghapus jenis ini dari rakitan Utilitas , pengembang memperkenalkan perubahan yang melanggar. Semua proyek yang mengkonsumsi akan rusak ketika diperbarui ke perakitan Utilitas terbaru.

Alih-alih mengharuskan proyek yang menggunakan untuk menambahkan referensi baru ke perakitan Umum , Anda dapat meneruskan jenisnya. Karena jenis ini dihapus dari rakitan Utilitas, Anda perlu mereferensikan proyek Utility.csproj dan Common.csproj:

<ItemGroup>
  <ProjectReference Include="..\Common\Common.csproj" />
</ItemGroup>

Proyek C# sebelumnya sekarang mereferensikan assembly Common yang baru saja dibuat. Ini bisa berupa PackageReference atau ProjectReference. Rakitan Utilitas perlu menyediakan informasi penerusan tipe data. Sesuai konvensi, deklarasi penerusan tipe biasanya dikemas dalam satu file yang dinamai TypeForwarders, pertimbangkan file C# TypeForwarders.cs berikut dalam assemblai Utility :

using System.Runtime.CompilerServices;
using Common.Objects;

[assembly:TypeForwardedTo(typeof(Example))]

Assembly Utility mereferensikan Assembly Common, dan meneruskan jenis Example. Jika Anda mengompilasi rakitan Utility dengan deklarasi penerusan tipe dan menjatuhkan Utility.dll ke dalam bin Consuming, aplikasi yang menggunakan akan berfungsi tanpa perlu dikompilasi.

Lihat juga