Adatszerződés -helyettesek
Az adatszerződés-helyettesítő egy speciális funkció, amely az Adatszerződés-modellre épül. Ez a funkció a típus testreszabására és helyettesítésére szolgál olyan helyzetekben, amikor a felhasználók módosítani szeretnék a típus szerializálásának, deszerializálásának vagy metaadatokká való kivetítésének módját. Bizonyos helyzetekben a helyettesítők akkor használhatók, ha nincs megadva adatszerződés a típushoz, a mezők és tulajdonságok nincsenek megjelölve az DataMemberAttribute attribútummal, vagy a felhasználók dinamikusan szeretnének sémavariációkat létrehozni.
A szerializálás és a deszerializálás az adatszerződés helyettesítő használatával történik, amikor a .NET-keretrendszer-ból megfelelő formátumra, például XML-formátumra való konvertálásra szolgálDataContractSerializer. Az adatszerződés helyettesítője a típusokhoz exportált metaadatok módosítására is használható, ha metaadat-reprezentációkat, például XML-sémadokumentumokat (XSD) hoz létre. Importáláskor a kód metaadatokból jön létre, és ebben az esetben a helyettesítő is használható a generált kód testreszabásához.
Hogyan működik a helyettes
A helyettesek úgy működnek, hogy egy típust (az "eredeti" típust) egy másik típusra (a "helyettesítő" típusra) leképeznek. Az alábbi példa az eredeti típust Inventory
és egy új helyettesítő típust InventorySurrogated
mutatja be. A Inventory
típus nem szerializálható, de a típus a InventorySurrogated
következő:
public class Inventory
{
public int pencils;
public int pens;
public int paper;
}
Mivel ehhez az osztályhoz nincs adatszerződés definiálva, konvertálja az osztályt helyettesítő osztálysá adatszerződéssel. A helyettesítő osztály az alábbi példában látható:
[DataContract(Name = "Inventory")]
public class InventorySurrogated
{
[DataMember]
public int numpencils;
[DataMember]
public int numpaper;
[DataMember]
private int numpens;
public int pens
{
get { return numpens; }
set { numpens = value; }
}
}
Az IDataContractSurrogate implementálása
Az adatszerződés helyettesítő használatához implementálja az interfészt IDataContractSurrogate .
Az alábbiakban áttekintheti az egyes módszereket IDataContractSurrogate egy lehetséges implementációval.
GetDataContractType
A GetDataContractType metódus megfelelteti az egyik típust a másiknak. Ez a módszer szerializáláshoz, deszerializáláshoz, importáláshoz és exportáláshoz szükséges.
Az első feladat annak meghatározása, hogy milyen típusok lesznek más típusokra leképezve. Példa:
public Type GetDataContractType(Type type)
{
Console.WriteLine("GetDataContractType");
if (typeof(Inventory).IsAssignableFrom(type))
{
return typeof(InventorySurrogated);
}
return type;
}
Szerializáláskor a metódus által visszaadott leképezést a rendszer a metódus meghívásával GetObjectToSerialize az eredeti példány helyettesítő példánysá alakításához használja.
Deszerializáláskor az e módszer által visszaadott leképezést a szerializáló használja a helyettesítő típus egy példányára való deszerializáláshoz. Ezt követően kéri GetDeserializedObject , hogy alakítsa át a helyettesítő példányt az eredeti típusú példánysá.
Exportálás esetén a metódus által visszaadott helyettesítő típus tükröződik, hogy lekérje az adatszerződést a metaadatok létrehozásához.
Importáláskor a kezdeti típus helyettesítő típusra változik, amely tükröződik az adatszerződés olyan célokra való felhasználásához, mint a hivatkozási támogatás.
A Type paraméter a szerializált, deszerializált, importált vagy exportált objektum típusa. A GetDataContractType metódusnak vissza kell adnia a bemeneti típust, ha a helyettesítő nem kezeli a típust. Ellenkező esetben adja vissza a megfelelő helyettesítő típust. Ha több helyettesítő típus létezik, ebben a metódusban számos leképezés definiálható.
A GetDataContractType metódus nem hívható meg beépített adatszerződési primitívekhez, például Int32 vagy String. Más típusok, például tömbök, felhasználó által definiált típusok és egyéb adatstruktúrák esetén a rendszer minden típushoz meghívja ezt a metódust.
Az előző példában a metódus ellenőrzi, hogy a type
paraméter Inventory
összehasonlítható-e. Ha igen, a metódus leképezi a következőre InventorySurrogated
: . Amikor szerializálást, deszerializálást, importálási sémát vagy exportálási sémát hív meg, a rendszer ezt a függvényt hívja meg először a típusok közötti leképezés meghatározásához.
GetObjectToSerialize metódus
A GetObjectToSerialize metódus az eredeti típuspéldányt helyettesítő típuspéldánysá alakítja. A szerializáláshoz ez a módszer szükséges.
A következő lépés a fizikai adatok leképezésének módja az eredeti példánytól a helyettesítő példányig a GetObjectToSerialize metódus implementálásával. Példa:
public object GetObjectToSerialize(object obj, Type targetType)
{
Console.WriteLine("GetObjectToSerialize");
if (obj is Inventory)
{
InventorySurrogated isur = new InventorySurrogated();
isur.numpaper = ((Inventory)obj).paper;
isur.numpencils = ((Inventory)obj).pencils;
isur.pens = ((Inventory)obj).pens;
return isur;
}
return obj;
}
A GetObjectToSerialize metódust akkor hívják meg, ha egy objektum szerializálva van. Ez a módszer adatokat továbbít az eredeti típusról a helyettesítő típus mezőire. A mezők közvetlenül leképezhetők helyettesítő mezőkre, vagy az eredeti adatok manipulálása tárolható a helyettesben. Néhány lehetséges felhasználási lehetőség: a mezők közvetlen leképezése, műveletek végrehajtása a helyettesítő mezőkben tárolandó adatokon, vagy az eredeti típusú XML tárolása a helyettesítő mezőben.
A targetType
paraméter a tag deklarált típusára hivatkozik. Ez a paraméter a metódus által GetDataContractType visszaadott helyettesítő típus. A szerializáló nem kényszeríti ki, hogy a visszaadott objektum hozzárendelhető legyen ehhez a típushoz. A obj
paraméter a szerializálni kívánt objektum, és szükség esetén helyettessé lesz konvertálva. Ennek a metódusnak vissza kell adnia a bemeneti objektumot, ha a helyettesítő nem kezeli az objektumot. Ellenkező esetben a rendszer visszaadja az új helyettesítő objektumot. A helyettesítő nem lesz meghívva, ha az objektum null értékű. Ebben a metódusban számos helyettesítő leképezés definiálható a különböző példányokhoz.
Amikor létrehoz egy objektumot DataContractSerializer, utasíthatja, hogy őrizze meg az objektumhivatkozásokat. (További információ: Szerializálás és deszerializálás.) Ez úgy történik, hogy a paramétert a preserveObjectReferences
konstruktorban a következőre true
állítja. Ebben az esetben a helyettesítő csak egyszer van meghívva egy objektumhoz, mivel az összes későbbi szerializáció csak írja a hivatkozást a streambe. Ha preserveObjectReferences
be van állítva false
, akkor a rendszer minden alkalommal meghívja a helyettest, amikor egy példányt észlel.
Ha a szerializált példány típusa eltér a deklarált típustól, a rendszer beírja a típusadatokat a streambe, például annak érdekében, xsi:type
hogy a példány deszerializálható legyen a másik végén. Ez a folyamat akkor fordul elő, ha az objektum helyettesítő vagy sem.
A fenti példa a példány adatait a Inventory
következőre konvertálja InventorySurrogated
: . Ellenőrzi az objektum típusát, és végrehajtja a szükséges manipulációkat a helyettesítő típusra való konvertáláshoz. Ebben az esetben az osztály mezői Inventory
közvetlenül át lesznek másolva az InventorySurrogated
osztálymezőkbe.
GetDeserializedObject metódus
A GetDeserializedObject metódus a helyettesítő típuspéldányt az eredeti típuspéldánysá alakítja. Deszerializáláshoz szükséges.
A következő feladat annak meghatározása, hogy a fizikai adatok hogyan lesznek leképezve a helyettesítő példányról az eredetire. Példa:
public object GetDeserializedObject(object obj, Type targetType)
{
Console.WriteLine("GetDeserializedObject");
if (obj is InventorySurrogated)
{
Inventory invent = new Inventory();
invent.pens = ((InventorySurrogated)obj).pens;
invent.pencils = ((InventorySurrogated)obj).numpencils;
invent.paper = ((InventorySurrogated)obj).numpaper;
return invent;
}
return obj;
}
Ezt a metódust csak egy objektum deszerializálása során hívjuk meg. Fordított adatleképezést biztosít a deszerializáláshoz a helyettesítő típustól az eredeti típusig. A módszerhez GetObjectToSerialize
hasonlóan egyes lehetséges felhasználási módok lehetnek a mezőadatok közvetlen cseréje, az adatokon végzett műveletek végrehajtása és AZ XML-adatok tárolása. Deszerializáláskor előfordulhat, hogy az adatátalakítás manipulációi miatt nem mindig kapja meg a pontos adatértékeket az eredetitől.
A targetType
paraméter a tag deklarált típusára hivatkozik. Ez a paraméter a metódus által GetDataContractType
visszaadott helyettesítő típus. A obj
paraméter a deszerializált objektumra hivatkozik. Az objektum visszaalakítható az eredeti típusára, ha helyettesítve van. Ez a metódus visszaadja a bemeneti objektumot, ha a helyettesítő nem kezeli az objektumot. Ellenkező esetben a deszerializált objektum az átalakítás befejezése után lesz visszaadva. Ha több helyettesítő típus is létezik, az egyes típusokat és azok átalakítását megadva megadhat adatátalakítást helyettesről elsődleges típusra.
Objektum visszaadásakor a belső objektumtáblák a helyettesítő által visszaadott objektummal frissülnek. A példányra való későbbi hivatkozások az objektumtáblákból szerzik be a helyettesítő példányt.
Az előző példa a típusobjektumokat InventorySurrogated
a kezdeti típusra Inventory
alakítja vissza. Ebben az esetben az adatok közvetlenül visszakerülnek InventorySurrogated
a megfelelő mezőkbe a következőben Inventory
: . Mivel nincsenek adatkezelések, az egyes tagmezők ugyanazokat az értékeket tartalmazzák, mint a szerializálás előtt.
GetCustomDataToExport metódus
Séma exportálása esetén a GetCustomDataToExport metódus nem kötelező. A rendszer további adatokat vagy tippeket szúr be az exportált sémába. A tag- vagy típusszinten további adatok is beszúrhatók. Példa:
public object GetCustomDataToExport(System.Reflection.MemberInfo memberInfo, Type dataContractType)
{
Console.WriteLine("GetCustomDataToExport(Member)");
System.Reflection.FieldInfo fieldInfo = (System.Reflection.FieldInfo)memberInfo;
if (fieldInfo.IsPublic)
{
return "public";
}
else
{
return "private";
}
}
Ez a módszer (két túlterheléssel) lehetővé teszi további információk felvételét a metaadatokba tag- vagy típusszinten. Tartalmazhat tippeket arról, hogy egy tag nyilvános vagy privát-e, valamint a séma exportálása és importálása során megőrzendő megjegyzések. Ez az információ e módszer nélkül elveszne. Ez a módszer nem okozza a tagok vagy típusok beszúrását vagy törlését, hanem további adatokat ad hozzá a sémákhoz ezen szintek valamelyikén.
A metódus túlterhelt, és egy (clrtype
paraméter) vagy MemberInfo (memberInfo
paraméter) paramétert is tartalmazhat Type
. A második paraméter mindig egy Type
(dataContractType
paraméter). Ezt a metódust a helyettes típus minden tagjára és típusára meghívjuk dataContractType
.
Ezen túlterhelések bármelyikének vagy szerializálható objektumot kell visszaadnia null
. A nem null értékű objektumokat a program széljegyzetként szerializálja az exportált sémába. A túlterhelés esetén a Type
sémába exportált típusokat a rendszer az első paraméterben erre a metódusra küldi, paraméterként dataContractType
pedig a helyettesítő típust. A túlterhelés esetén a MemberInfo
sémába exportált tagok a második paraméterben a helyettesítő típussal rendelkező paraméterként memberInfo
küldik el az adatait.
GetCustomDataToExport metódus (típus, típus)
A IDataContractSurrogate.GetCustomDataToExport(Type, Type) metódust a rendszer a sémaexportálás során hívja meg minden típusdefinícióhoz. A metódus adatokat ad hozzá a sémán belüli típusokhoz exportáláskor. A rendszer minden definiált típust erre a metódusra küld annak megállapításához, hogy vannak-e további adatok, amelyeket fel kell venni a sémába.
GetCustomDataToExport metódus (MemberInfo, type)
Az IDataContractSurrogate.GetCustomDataToExport(MemberInfo, Type) exportálás során a rendszer az exportált típusok minden tagját meghívja. Ez a függvény lehetővé teszi, hogy testre szabja az exportáláskor a sémában szereplő tagok megjegyzéseit. Az osztály minden tagjának adatait erre a metódusra küldi a rendszer, hogy ellenőrizze, kell-e további adatokat hozzáadni a sémához.
A fenti példa végigkeresi a dataContractType
helyettesek minden tagját. Ezután visszaadja az egyes mezők megfelelő hozzáférési módosítóit. A testreszabás nélkül a hozzáférési módosítók alapértelmezett értéke nyilvános. Ezért minden tag nyilvánosként lesz definiálva az exportált sémával létrehozott kódban, függetlenül attól, hogy a tényleges hozzáférési korlátozások milyenek. Ha nem használja ezt a megvalósítást, a tag numpens
nyilvános lesz az exportált sémában, annak ellenére, hogy a helyettesben privátként lett definiálva. Ennek a módszernek a használatával az exportált sémában a hozzáférés-módosító privátként hozható létre.
GetReferencedTypeOnImport metódus
Ez a módszer megfelelteti a Type helyettest az eredeti típusnak. Ez a módszer nem kötelező a séma importálásához.
Ha olyan helyettesítő példányt hoz létre, amely importál egy sémát, és kódot hoz létre hozzá, a következő feladat a helyettesítő példány típusának meghatározása az eredeti típusra.
Ha a létrehozott kódnak egy meglévő felhasználói típusra kell hivatkoznia, ezt a GetReferencedTypeOnImport metódus implementálásával hajtja végre.
Séma importálásakor a rendszer minden típusdeklarációhoz meghívja ezt a metódust, hogy a helyettesítő adatszerződést típusra képezhesse le. A sztring paraméterei typeName
, valamint typeNamespace
a helyettesítő típus neve és névtere. A visszaadott GetReferencedTypeOnImport érték annak meghatározására szolgál, hogy létre kell-e hozni egy új típust. Ennek a metódusnak érvényes vagy null értéket kell visszaadnia. Érvényes típusok esetén a visszaadott típus hivatkozási típusként lesz használva a létrehozott kódban. Ha null értéket ad vissza, a rendszer nem hivatkozik típusra, és létre kell hozni egy új típust. Ha több helyettes létezik, az egyes helyettesítő típusok leképezését vissza lehet hajtani a kezdeti típusra.
A customData
paraméter az eredetileg visszaadott GetCustomDataToExportobjektum. Ez customData
akkor használatos, ha a helyettesítő szerzők további adatokat/tippeket szeretnének beszúrni a metaadatokba, amelyeket az importálás során használnak a kód létrehozásához.
ProcessImportedType metódus
A ProcessImportedType metódus testre szabja a sémaimportálásból létrehozott összes típust. Ez a módszer nem kötelező.
Séma importálásakor ez a módszer lehetővé teszi az importált típus- és fordítási információk testreszabását. Példa:
public System.CodeDom.CodeTypeDeclaration ProcessImportedType(System.CodeDom.CodeTypeDeclaration typeDeclaration, System.CodeDom.CodeCompileUnit compileUnit)
{
Console.WriteLine("ProcessImportedType");
foreach (CodeTypeMember member in typeDeclaration.Members)
{
object memberCustomData = member.UserData[typeof(IDataContractSurrogate)];
if (memberCustomData != null
&& memberCustomData is string
&& ((string)memberCustomData == "private"))
{
member.Attributes = ((member.Attributes & ~MemberAttributes.AccessMask) | MemberAttributes.Private);
}
}
return typeDeclaration;
}
Az importálás során a rendszer minden létrehozott típushoz meghívja ezt a metódust. Módosítsa a megadott CodeTypeDeclaration értéket, vagy módosítsa a CodeCompileUnit. Ebbe beletartozik a név, a tagok, az attribútumok és a többi tulajdonság módosítása is CodeTypeDeclaration
. A feldolgozással CodeCompileUnit
módosíthatja az irányelveket, a névtereket, a hivatkozott szerelvényeket és számos egyéb szempontot.
A CodeTypeDeclaration
paraméter tartalmazza a kód DOM-típusdeklarációját. A CodeCompileUnit
paraméter lehetővé teszi a kód feldolgozásának módosítását. Az elvetett típusdeklaráció eredményének visszaadása null
. Ezzel szemben a módosítások a visszatéréskor CodeTypeDeclaration
megmaradnak.
Ha egyéni adatokat szúr be a metaadatok exportálása során, az importálás során meg kell adni a felhasználónak, hogy azok felhasználhatók legyenek. Ezek az egyéni adatok felhasználhatók a programozási modell tippjeihez vagy más megjegyzésekhez. CodeTypeMember Minden CodeTypeDeclaration
egyes példány egyéni adatokat tartalmaz tulajdonságkéntUserData, és a IDataContractSurrogate
típusra öntött.
A fenti példa néhány módosítást hajt végre az importált sémán. A kód egy helyettes használatával megőrzi az eredeti típusú magánszemélyeket. A séma importálásakor az alapértelmezett hozzáférési módosító a public
. Ezért a helyettesítő séma minden tagja nyilvános lesz, kivéve, ha módosítják, mint ebben a példában. Az exportálás során az egyéni adatok be lesznek szúrva a privát tagok metaadataiba. A példa megkeresi az egyéni adatokat, ellenőrzi, hogy a hozzáférés-módosító privát-e, majd az attribútumok beállításával módosítja a megfelelő tagot, hogy privát legyen. A testreszabás nélkül a tag privát numpens
helyett nyilvánosként lesz definiálva.
GetKnownCustomDataTypes metódus
Ez a metódus a sémából definiált egyéni adattípusokat szerzi be. A módszer nem kötelező a séma importálásához.
A metódus meghívása a sémaexportálás és -importálás elején történik. A metódus az exportált vagy importált sémában használt egyéni adattípusokat adja vissza. A metódus átad egy Collection<T> (paraméter customDataTypes
) paramétert, amely típusgyűjtemény. A metódusnak további ismert típusokat kell hozzáadnia ehhez a gyűjteményhez. Az ismert egyéni adattípusok szükségesek az egyéni adatok szerializálásának és deszerializálásának engedélyezéséhez a DataContractSerializer. További információ: Adatszerződés ismert típusai.
Béranya megvalósítása
Ha a WCF-ben szeretné használni az adatszerződést, be kell tartania néhány speciális eljárást.
Helyettesítő használata szerializáláshoz és deszerializáláshoz
A helyettesítővel DataContractSerializer szerializálhatja és deszerializálhatja az adatokat. A DataContractSerializer létrehozva a DataContractSerializerOperationBehavior. A helyettest is meg kell adni.
Szerializálás és deszerializálás megvalósítása
Hozzon létre egy példányt a ServiceHost szolgáltatáshoz. A teljes útmutatásért tekintse meg az alapszintű WCF-programozást.
A megadott szolgáltatásgazda mindegyikéhez ServiceEndpoint keresse meg a OperationDescription.
Keresse meg a művelet viselkedését, és állapítsa meg, hogy megtalálható-e a DataContractSerializerOperationBehavior példány.
Ha talál egy DataContractSerializerOperationBehavior tulajdonságot, állítsa be a tulajdonságát DataContractSurrogate a helyettes új példányára. Ha nem DataContractSerializerOperationBehavior található, hozzon létre egy új példányt, és állítsa az DataContractSurrogate új viselkedés tagját a helyettes új példányára.
Végül adja hozzá ezt az új viselkedést az aktuális műveleti viselkedéshez, ahogyan az a következő példában látható:
using (ServiceHost serviceHost = new ServiceHost(typeof(InventoryCheck))) foreach (ServiceEndpoint ep in serviceHost.Description.Endpoints) { foreach (OperationDescription op in ep.Contract.Operations) { DataContractSerializerOperationBehavior dataContractBehavior = op.Behaviors.Find<DataContractSerializerOperationBehavior>() as DataContractSerializerOperationBehavior; if (dataContractBehavior != null) { dataContractBehavior.DataContractSurrogate = new InventorySurrogated(); } else { dataContractBehavior = new DataContractSerializerOperationBehavior(op); dataContractBehavior.DataContractSurrogate = new InventorySurrogated(); op.Behaviors.Add(dataContractBehavior); } } }
Helyettesítő használata metaadatok importálásához
Ha olyan metaadatokat importál, mint a WSDL és az XSD az ügyféloldali kód létrehozásához, a helyettesítőt hozzá kell adni ahhoz az összetevőhöz, amely az XSD-sémából származó kód generálásáért felelős. XsdDataContractImporter Ehhez közvetlenül módosítsa a WsdlImporter metaadatok importálásához használt adatokat.
Helyettesítő metaadatok importálásának megvalósítása
Importálja a metaadatokat az WsdlImporter osztály használatával.
Ezzel a TryGetValue módszerrel ellenőrizheti, hogy van-e definiálva.XsdDataContractImporter
Ha a TryGetValue metódus visszatér
false
, hozzon létre egy újat XsdDataContractImporter , és állítsa be a tulajdonságát Options az ImportOptions osztály új példányára. Ellenkező esetben használja a módszer paramétere általout
visszaadott importőrt TryGetValue .Ha a XsdDataContractImporter tulajdonság nincs ImportOptions definiálva, állítsa be a tulajdonságot az ImportOptions osztály új példányának.
Állítsa be a DataContractSurrogateImportOptions helyettes tulajdonságát XsdDataContractImporter egy új példányra.
Adja hozzá az XsdDataContractImporter osztály tulajdonsága WsdlImporter által State visszaadott MetadataExporter gyűjteményhez.)
ImportAllContracts A metódus használatával importálhatja az WsdlImporter összes adatszerződést a sémán belül. Az utolsó lépés során a rendszer a helyettesítőbe való behívással létrehozott sémákból hoz létre kódot.
MetadataExchangeClient mexClient = new MetadataExchangeClient(metadataAddress); mexClient.ResolveMetadataReferences = true; MetadataSet metaDocs = mexClient.GetMetadata(); WsdlImporter importer = new WsdlImporter(metaDocs); object dataContractImporter; XsdDataContractImporter xsdInventoryImporter; if (!importer.State.TryGetValue(typeof(XsdDataContractImporter), out dataContractImporter)) xsdInventoryImporter = new XsdDataContractImporter(); xsdInventoryImporter = (XsdDataContractImporter)dataContractImporter; xsdInventoryImporter.Options ??= new ImportOptions(); xsdInventoryImporter.Options.DataContractSurrogate = new InventorySurrogated(); importer.State.Add(typeof(XsdDataContractImporter), xsdInventoryImporter); Collection<ContractDescription> contracts = importer.ImportAllContracts();
Helyettesítő használata metaadatok exportálásához
Ha metaadatokat exportál egy szolgáltatás WCF-éből, alapértelmezés szerint WSDL- és XSD-sémát is létre kell hozni. A helyettesítőt hozzá kell adni az XSD-séma adatszerződés-típusokhoz való létrehozásához felelős összetevőhöz. XsdDataContractExporter Ehhez használjon olyan viselkedést, amely implementálja IWsdlExportExtension a WsdlExportermetaadatok módosítását, vagy közvetlenül módosítsa a WsdlExporter metaadatok exportálásához használt adatokat.
Helyettesítő használata metaadatok exportálásához
Hozzon létre egy újat WsdlExporter , vagy használja a
wsdlExporter
metódusnak átadott paramétert ExportContract .A függvény használatával TryGetValue ellenőrizheti, hogy van-e definiálva.XsdDataContractExporter
Ha TryGetValue visszaadja
false
, hozzon létre egy újat XsdDataContractExporter a létrehozott XML-sémákkal a WsdlExporterfájlból, és adja hozzá a gyűjteményhez, amelyet a WsdlExporterState tulajdonság visszaadott. Ellenkező esetben használja a módszer paramétere általout
visszaadott exportőrt TryGetValue .Ha a XsdDataContractExporter tulajdonság nincs ExportOptions definiálva, állítsa a Options tulajdonságot az ExportOptions osztály új példányára.
Állítsa be a DataContractSurrogateExportOptions helyettes tulajdonságát XsdDataContractExporter egy új példányra. A metaadatok exportálásának további lépései nem igényelnek módosításokat.
WsdlExporter exporter = new WsdlExporter(); //or //public void ExportContract(WsdlExporter exporter, // WsdlContractConversionContext context) { ... } object dataContractExporter; XsdDataContractExporter xsdInventoryExporter; if (!exporter.State.TryGetValue(typeof(XsdDataContractExporter), out dataContractExporter)) { xsdInventoryExporter = new XsdDataContractExporter(exporter.GeneratedXmlSchemas); } else { xsdInventoryExporter = (XsdDataContractExporter)dataContractExporter; } exporter.State.Add(typeof(XsdDataContractExporter), xsdInventoryExporter); if (xsdInventoryExporter.Options == null) xsdInventoryExporter.Options = new ExportOptions(); xsdInventoryExporter.Options.DataContractSurrogate = new InventorySurrogated();