Was dit nuttig?

Oplossing

As dit vir XML serialisasie en NHibernate, waar jy wil die parameterless constructor om toeganklik te wees (soos in die geval in die voorbeeld jy verwys), gebruik dan 'n private of beskerm parameterless constructor vir serialisasie, of 'n beskermde constructor vir NHibernate. Met die beskermde weergawe, is jy die opening van jouself tot geërf klasse in staat is om daardie kode bel.

As jy nie kode wil uitroep van 'n metode, moenie dit toeganklik te maak.

EDIT: Om miskien beantwoord die dieper vraag, AFAIK die samesteller net weet omtrent drie eienskappe: Uitgediende, Voorwaardelike en AttributeUsage . Om spesiale hantering voeg vir ander eienskappe sou vereis wysiging van die samesteller.

Ander wenke

Ek dink dit sou 'n uitstekende funksie versoek vir Microsoft wees: Skep 'n abstrakte basis klas kenmerk CompilerExecutedAttribute dat die samesteller prosesse op 'n wyse of dat die samestelling proses kan beïnvloed. Dan kan ons erf hierdie kenmerk en te implementeer verskillende bedrywighede, bv uitstraal 'n fout of 'n waarskuwing.

As jy kyk na 'n waarskuwing (en dit is wat [Uitgediende] gooi) bou-breaking, dan net gebruik om die # waarskuwing samesteller richtlijn.

Edit: Ek het nog nooit gebruik nie, maar #error is ook beskikbaar.

Ek dink die enigste fool proof manier sou wees om die Visual Studio (deur VSIP) uit te brei en in te skryf vir die korrekte geval (miskien in die EnvDTE.BuildEvents) klas, en maak seker jou kode vir gebruik van die konstruktor, en kanselleer die bou as jy dit op te spoor.

Dit is al besig om te klink 'n bietjie soos TDWTF Gister se . : -)

Ek sal moet saamstem met Greg: make-up 'n kenmerk vir dit.

As jy regtig ernstig is, miskien vind 'n manier om uit te vind of die constructor word verkry deur enigiets anders as XMLSerializer en gooi 'n uitsondering as dit is.

Ek sal jy voorstel om die #error richtlijn te gebruik.

Nog 'n mooi onbekende kenmerk wat die werk kan doen, is om die voorwaardelike kenmerk (afhangende van wat jy probeer om ahieve)

[Conditional("CONDITION")] 
public static void MiMethod(int a, string msg)

wat die metode aanroeping van die IL-kode self as "MY_CONDITION" word gedefinieer sal verwyder.

Skep 'n FxCop reël, en voeg FxCop om jou integrasie bou ten einde na te gaan vir hierdie.

Jy sal waarskuwings kry, eerder as 'n versuim bou. Eienskappe 'doen' by nadenke tyd eerder as om te bou tyd.

As alternatief (en dit is eerder nare) sit 'n samesteller richtlijn rondom die metode wat jy wil nie genoem te word nie. Dan sal jou kode te breek as jy dit noem, maar jy kan die opstel van 'n gebou wat die reg samesteller richtlijn gaan en nie.

Gooi 'n persoonlike uitsondering en eenheid toets vir dit as 'n post bou stap

In antwoord 4 jaar later :)

Ek het dieselfde vraag of daar 'n alternatief vir uitgedien.

Van wat ek onthou (channel9 videos) 'n kort rukkie gelede Microsoft het gesê dat dit is besig met die gee van devs toegang tot iets soos 'n samesteller api op 'n stadium so in die toekoms dit is moontlik dat jy 'n samesteller "plugin" kon skryf wat sal toelaat om te metodes versier met jou eie persoonlike kenmerk en vertel die samesteller te kanselleer indien dit lyk asof die versier kode kan word om die naam 'n paar waar anders in die kode, ens

Watter eintlik pretty cool wees as jy daaroor dink. Dit herinner my ook dat ek ook moet probeer en lees oor die vordering van die samesteller api ding MS is besig met ...

Waarom nie net iets make-up? 'N onbekende kenmerk sou sekerlik breek die bou.

[MyMadeUpAttributeThatBreaksTheBuildForSure]
public class NotDoneYet {}
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top