Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Předávání typů umožňuje přesunout typ do jiného sestavení bez nutnosti překompilovat aplikace, které používají původní sestavení.
Předpokládejme například, že aplikace používá Example třídu v sestavení s názvem Utility.dll. Vývojáři Utility.dll se mohou rozhodnout refaktorovat sestavení a při tom mohou přesunout Example třídu do jiného sestavení. Pokud je stará verze Utility.dll nahrazena novou verzí Utility.dll a jeho doprovodné sestavení, aplikace, která používá Example třídu, selže, protože nemůže najít Example třídu v nové verzi Utility.dll.
Vývojáři Utility.dll se tomu můžou vyhnout předáváním požadavků pro Example třídu pomocí atributu TypeForwardedToAttribute . Pokud byl atribut aplikován na novou verzi Utility.dll, požadavky týkající se Example třídy jsou prezměřeny na sestavení, které nyní tuto třídu obsahuje. Stávající aplikace nadále funguje normálně bez rekompilace.
Přeposlat typ
Typ se přeposílá ve čtyřech krocích:
Přesuňte zdrojový kód pro typ z původního sestavení do cílového sestavení.
V sestavení, kde se typ dříve nacházel, přidejte TypeForwardedToAttribute pro typ, který byl přesunut. Následující kód ukazuje atribut pro typ,
Examplekterý byl přesunut.[assembly:TypeForwardedToAttribute(Example::typeid)][assembly:TypeForwardedToAttribute(typeof(Example))]Zkompilujte sestavení, které nyní obsahuje typ.
Překompilujte sestavení, ve kterém se typ nachází, s odkazem na sestavení, které nyní obsahuje typ. Pokud například kompilujete soubor jazyka C# z příkazového řádku, použijte možnost Odkazy (možnosti kompilátoru jazyka C#) k určení sestavení, které obsahuje daný typ. V jazyce C++ použijte direktivu #using ve zdrojovém souboru k určení sestavení, které obsahuje typ.
Příklad předávání typu C#
Pokračujte z výše konstruovaného popisu příkladu, představte si, že vyvíjíte Utility.dll, a máte Example třídu.
Utility.csproj je jednoduchá knihovna tříd:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsing>true</ImplicitUsing>
</PropertyGroup>
</Project>
Třída Example poskytuje některé vlastnosti a překryté metody 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}";
}
Teď si představte, že existuje konzumní projekt a je reprezentován v sestavení Spotřebitel. Tento projekt odkazuje na sestavení Utility. Například vytvoří instanci objektu Example a zapíše ho do konzoly v souboru Program.cs :
using System;
using Common.Objects;
Example example = new();
Console.WriteLine(example);
Při spuštění aplikace, která spotřebovává objekt, vypíše stav objektu Example. V tomto okamžiku neexistuje žádný typ předávání, protože Consuming.csproj odkazuje na Utility.csproj. Vývojáři sestavení Utility se však rozhodnou odebrat Example objekt jako součást refaktoringu. Tento typ se přesune do nově vytvořeného souboru Common.csproj.
Odebráním tohoto typu ze sestavení Utility zavádějí vývojáři zásadní změnu. Všechny projekty, které využívají, se přeruší při aktualizaci na nejnovější sestavení Utility.
Místo toho, aby projekty musely přidat nový odkaz na Common sestavení, můžete typ přesměrovat. Vzhledem k tomu, že byl tento typ odebrán ze sestavení Utility, budete muset mít Utility.csproj odkazovat na Common.csproj:
<ItemGroup>
<ProjectReference Include="..\Common\Common.csproj" />
</ItemGroup>
Předchozí projekt jazyka C# teď odkazuje na nově vytvořené společné sestavení. Může to být buď PackageReference nebo ProjectReference.
Sestavení Utility musí poskytnout informace o předávání typu. Podle konvence se deklarace typů obvykle zapouzdřují do jednoho souboru, který je označen jako TypeForwarders. Podívejte se na následující soubor C# TypeForwarders.cs v sestavení Utility:
using System.Runtime.CompilerServices;
using Common.Objects;
[assembly:TypeForwardedTo(typeof(Example))]
Sestavení Utility odkazuje na Common sestavení a předává Example typ. Pokud chcete sestavení Utility zkompilovat s deklaracemi předávání typů a vložit Utility.dll do složky Consuming, bude spotřebovávající aplikace fungovat bez kompilace.