Ich stieß auf dieses Attribut in this post und this one. Es scheint, dass es sehr nützlich ist, wenn wir ein altes System aktualisieren müssen. Dann erstelle ich eine Testlösung (mit 3 Projekten darin), um dieses Attribut zu verwenden. Zuerst gibt es ein Klassenbibliotheksprojekt namens "Animal".Wie kann TypeForwardedToAttribute korrekt verwendet werden?
namespace Animal
{
public class Dog
{
public static string Name = "old version";
}
}
Dann erstelle ich eine Konsolenanwendung Projekt, fügen Sie "Animal" als Referenz, und in der Main
Methode, die ich habe:
Console.WriteLine(Animal.Dog.Name);
Jetzt druckt es "alte Version". Groß! Jetzt beginne ich, das bestehende Projekt zu "upgraden". Ich entferne die Klasse Dog
in „Animal“ fügen Sie eine weitere Klassenbibliothek Projekt mit dem Namen „AdvancedAnimal“, die enthält:
namespace Animal
{
public class Dog
{
public static string Name = "new version";
}
}
hinzufügen „AdvancedAnimal“ als Referenz in „Animal“. Auch AssemblyInfo.cs
von „Animal“ modifiziert wird durch Zugabe:
[assembly: TypeForwardedTo(typeof(Animal.Dog))]
Von der Verwendung dieses Attributs, von nun an allen Animal.Dog
weitergeleitet wird an die Dog
Klasse in „AdvancedAnimal“ (eigentlich gibt es keine Dog
Klasse in Tiere jeden Mehr). Ich kompiliere die gesamte Lösung neu und hoffe, dass die Konsolenanwendung "neue Version" druckt. Aber es gibt mir einen Compiler-Fehler:
The type name 'Dog' could not be found in the namespace 'Animal'. This type has been forwarded to assembly 'AdvancedAnimal, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' Consider adding a reference to that assembly.
Oh, ich sagte „AdvancedAnimal“ als Verweis auf meine Konsole Anwendung hinzuzufügen! Aber wenn ich das tue, brauche ich das Attribut nicht mehr, denn wenn ich "AdvancedAnimal" als Referenz in der Konsolenanwendung hinzufüge, verweist Animal.Dog
natürlich den in "AdvancedAnimal"! Was ich erwarte, ist das Ändern von "Animal", Hinzufügen von "AdvancedAnimal", keine Änderung aller anderen Projekte/Klassenbibliotheken erforderlich, da die Assembly-Informationen bereits genügend Informationen zur Verfügung stellen. Das ist sehr praktisch, wenn Sie ein System aktualisieren. Ansonsten habe ich 20 Projekte, die sich auf "Animal" beziehen, ich muss "AdvancedAnimal" als Referenz für alle hinzufügen. Und noch wichtiger ist, dass ich in dieser Lösung keine Verwendung von "TypeForwardedToAttribute" finden kann, das Entfernen ist egal. Kannst du mir sagen, was mit meinem Test/Idee falsch ist?
"Aber was Sie tun, ist die Weiterleitung des Typs von der gleichen Baugruppe zu einem anderen Typ in der gleichen Baugruppe", nein. zwei Baugruppen, "Animal" und "Advanced Animal". –
Aber der Namespace bleibt "Animal", denn in einem der Post sagt der Autor, dass wir den Namespace hier nicht ändern können. –
Was ich getan habe, ist genau das, was Sie mir gesagt haben, aber es funktioniert nicht wie erwartet. –