Penerusan jenis dalam runtime bahasa umum
Penerusan jenis memungkinkan Anda untuk memindahkan jenis ke rakitan lain tanpa harus mengompilasi ulang aplikasi yang menggunakan rakitan asli.
Misalnya, aplikasi menggunakan kelas Example
dalam rakitan bernama Utility.dll. Pengembang Utility.dll mungkin memutuskan untuk merefaktor rakitan, dan dalam prosesnya mereka mungkin memindahkan kelas Example
ke rakitan lain. Jika versi lama Utility.dll digantikan oleh versi baru Utility.dll dan rakitan pendampingnya, aplikasi yang menggunakan kelas Example
gagal karena tidak dapat menemukan kelas Example
dalam versi baru Utility.dll.
Pengembang Utility.dll dapat menghindari hal ini dengan meneruskan permintaan untuk kelas Example
, menggunakan atribut TypeForwardedToAttribute. Jika atribut telah diterapkan ke versi baru Utility.dll, permintaan untuk kelas Example
diteruskan ke rakitan yang sekarang berisi kelas tersebut. Aplikasi yang ada terus berfungsi normal, tanpa rekompilasi.
Meneruskan jenis
Ada empat langkah untuk meneruskan jenis:
Pindahkan kode sumber untuk jenis dari rakitan asli ke rakitan tujuan.
Dalam rakitan di mana jenisnya dulu 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))]
Kompilasi rakitan yang sekarang berisi jenis tersebut.
Kompilasi ulang rakitan tempat jenis dulu berada, dengan referensi ke rakitan yang sekarang berisi jenisnya. Misalnya, jika Anda mengompilasi file C# dari baris perintah, gunakan opsi Referensi (opsi pengompilasi C#) untuk menentukan rakitan yang berisi jenis. Di C++, gunakan arahan #using dalam file sumber untuk menentukan rakitan yang berisi jenis.
Contoh penerusan jenis C#
Melanjutkan dari contoh deskripsi buatan di atas, bayangkan Anda 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 menimpa 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 proyek yang mengonsumsi dan diwakili dalam rakitan Konsumen. Proyek pengonsumsi ini mereferensikan rakitan Utilitas. Sebagai contoh, ini membuat instans objek Example
dan menulisnya ke konsol dalam file Program.cs-nya:
using System;
using Common.Objects;
Example example = new();
Console.WriteLine(example);
Saat aplikasi yang mengonsumsi berjalan, aplikasi tersebut akan menghasilkan status objek Example
. Pada titik ini, tidak ada penerusan jenis karena Consuming.csproj mereferensikan Utility.csproj. Namun, pengembang dari rakitan Utilitas memutuskan untuk menghapus objek Example
sebagai bagian dari refaktor. Jenis ini dipindahkan ke Common.csproj yang baru dibuat.
Dengan menghapus jenis ini dari perakitan Utilitas, pengembang memperkenalkan perubahan yang melanggar. Semua proyek yang mengonsumsi akan rusak ketika diperbarui ke rakitan Utilitas terbaru.
Alih-alih mengharuskan proyek pengonsumsi untuk menambahkan referensi baru ke perakitan Umum, Anda dapat meneruskan jenisnya. Karena jenis ini dihapus dari rakitan Utilitas, Anda harus membuat Utility.csproj mereferensikan Common.csproj:
<ItemGroup>
<ProjectReference Include="..\Common\Common.csproj" />
</ItemGroup>
Proyek C# sebelumnya sekarang mereferensikan rakitan Umum yang baru dibuat. Ini bisa berupa PackageReference
atau ProjectReference
. Rakitan Utilitas perlu memberikan informasi penerusan jenis. Berdasarkan konvens,i deklarasi penerusan jenis biasanya dirangkum dalam satu file bernama TypeForwarders
, pertimbangkan file C# TypeForwarders.cs berikut di rakitan Utilitas:
using System.Runtime.CompilerServices;
using Common.Objects;
[assembly:TypeForwardedTo(typeof(Example))]
Rakitan Utilitas mereferensikan rakitan Umum, dan meneruskan jenis Example
. Jika Anda mengompilasi rakitan Utilitas dengan deklarasi penerusan jenis dan menjatuhkan Utility.dll ke dalam tempat Konsumsi, aplikasi yang mengonsumsi akan berfungsi tanpa dikompilasi.
Lihat juga
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk