Vraag Hoe maak ik een nieuw gedelegeerd type op basis van een bestaand type, in C #?


Is er een manier om een ​​nieuw type afgevaardigde te maken op basis van een bestaand type? In mijn geval wil ik een afgevaardigde maken MyMouseEventDelegate welke dezelfde functionaliteit zou hebben als EventHandler<MouseEventArgs>.

Waarom wil ik dit? Om te profiteren van compilatie-type controle, natuurlijk! Op deze manier kan ik twee verschillende afgevaardigden hebben: MyRightClickHandler en MyLeftClickHandleren nooit zullen de twee in de war raken - zelfs als ze beide functioneel identiek zijn aan EventHandler<MouseEventArgs>.

Is er een syntaxis om dit soort dingen te doen?

Oh, en codeer als:

using MyRightClickHandler = EventHandler<MouseEventArgs>

is niet goed genoeg Het voert geen typecontrole uit, omdat er feitelijk geen nieuw type wordt aangemaakt. En ik zou zo'n regel in elk codebestand moeten plakken waar ik naar zou verwijzen MyRightClickHandler.


15
2018-05-14 06:25


oorsprong


antwoorden:


Nou, het is zo simpel als het kopiëren van de gedelegeerde verklaring van het origineel. Er is niets in C # om dit automatisch te doen, maar ik zie het niet als een zware last:

public delegate void MyLeftClickHandler(object sender, MouseEventArgs e);
public delegate void MyRightClickHandler(object sender, MouseEventArgs e);

Het is niet zoals MouseEventHandler gaat binnenkort veranderen ...

Ben je eigenlijk gebeten door fouten als gevolg van het gebruik van de verkeerde afgevaardigden op de verkeerde plaatsen? Ik kan me niet herinneren dat ik dit ooit een probleem heb gevonden, en het lijkt mij dat je meer werk introduceert (en een onbekende groep afgevaardigden voor andere ontwikkelaars) - weet je zeker dat het het waard is?


12
2018-05-14 06:32



Ik wil alleen de controle van het compilatietype bereiken. Ik denk dat het voldoende zou zijn om gespecialiseerde EventArgs-klassen te maken voor de cases die u beschrijft. Op die manier kunt u nog steeds profiteren van de vooraf gedefinieerde deelnemers:

class RightMouseButtonEventArgs : MouseEventArgs {}
class LeftMouseButtonEventArgs : MouseEventArgs {}

EventHandler<RightMouseButtonEventArgs>
EventHandler<LeftMouseButtonEventArgs>

5
2018-05-14 06:33



Nee. Volgens de C # documentatie, delegatietypen zijn verzegeld en u kunt geen nieuw gedelegeerd type maken dat erft van een bestaand type.


4
2018-01-21 02:25



Ik geloofde niet jon-skeet. Ik moest het zelf proberen. Hij had gelijk.

public void F(object sender, MouseEventArgs e) {}; 
public MyLeftClickHandler l;
public MyRightClickHandler r;
public void Test()
{
    l = F;  // Automatically converted.
    r = F;  // Automatically converted to a different type.
    l = r;  // Syntax error.  Incompatible types.
    l = new MyLeftClickHandler(r);  // Explicit conversion works.
}

Dat was niet duidelijk!


3
2017-09-05 16:21