Hoe een namespace-brede C # alias definiëren?

Het is mogelijk om een ​​alias in C# zoals dit te definiëren

using kvp = System.Collections.Generic.KeyValuePair;

var pair = new kvp("key", "value");

Microsoft definieert ook aliassen:

        int i;
        Int32 i2;

Hoe kunnen we aliassen definiëren die beschikbaar zijn in een naamruimte? Is dit configureerbaar?


Deze vraag heeft specifiek betrekking op een alias ... dus het gebruik van overerving als proxy is niet gewenst. Ik ben daar in veel situaties blij mee ... maar niet wanneer je het beste wilt van zowel beschrijvende namen als een verkorte versie.

5
en meer over het onderwerp is hier: stackoverflow.com/questions/62503/c-int-or-int32-should-i-ca‌ re , een oplossing van de top van mijn hoofd is dat je een klasse kunt hebben die is afgeleid van een basis klas met een andere naam.
toegevoegd de auteur Jeremy Thompson, de bron
mogelijk duplicaat van Doet C# ondersteuningsproject- Wide Default Namespace Imports Like VB.NET?
toegevoegd de auteur nawfal, de bron
De reden dat u int overal kunt gebruiken, is omdat het een trefwoord C# is zoals gedefinieerd in de taal, niet een alias zoals gedefinieerd met een met . Int32 is meestal slechts System.Int32 , ervan uitgaande dat using System; al aanwezig is. Ook wordt int rechtstreeks toegewezen aan System.Int32 .
toegevoegd de auteur BoltClock, de bron
VB.NET heeft het, C ++/CLI heeft het, C# heeft het niet.
toegevoegd de auteur Hans Passant, de bron
toegevoegd de auteur oleksii, de bron
@HansPassant: zou u dit willen voorstellen als een antwoord?
toegevoegd de auteur sgtz, de bron

2 antwoord

I don't think that what you're asking for is really possible. Here's a workaround: include a type called kvp that is a copy of KeyValuePair and implicitly converts to and from your type.

public struct kvp
{
    public string Key { get; private set; }
    public string Value { get; private set; }

    public kvp(string key, string value)
        : this()
    {
        Key = key;
        Value = value;
    }
    public override string ToString()
    {
        return ((KeyValuePair)this).ToString();
    }

    public static implicit operator KeyValuePair(kvp k)
    {
        return new KeyValuePair(k.Key, k.Value);
    }
    public static implicit operator kvp(KeyValuePair k)
    {
        return new kvp(k.Key, k.Value);
    }
}

This has the effect of you being able to use kvp instead of KeyValuePair, with no unintended effects in most cases.

Als het type dat u wilt typen, een niet-gesloten klasse is, kunt u (iets heel dichtbij) doen wat u wilt door een klasse te maken die de klasse uitbreidt, waarbij alle constructors van de basisklasse worden weerspiegeld en worden uitgebreid (... ) .

5
toegevoegd
+1 Dit is wat ik ook zou doen. Ik raad ook aan om de operatoren Equals (), GetHashCode (), ==() en! =() Te implementeren. U zou een KeyValuePair in plaats van de tekenreeks van de sleutel, value string ook kunnen houden.
toegevoegd de auteur Danny Varod, de bron
Als u impliciet gieten niet wilt inschakelen (als u consumenten wilt dwingen uw type te gebruiken), gebruikt u in plaats daarvan ook expliciete operatoren.
toegevoegd de auteur Danny Varod, de bron

U vraagt ​​expliciet om een ​​alias en niet om een ​​tijdelijke oplossing. Daarom is het enige antwoord dat ik heb: er is geen manier om dit te doen.

De met alias die u als voorbeeld heeft gegeven, is per bestand. C# heeft geen construct waarmee aliassen met meerdere bestanden kunnen worden gebruikt.

4
toegevoegd