MetadataImporter::State Property

 

Gets or sets a collection of objects used in the importing of metadata.

Namespace:   System.ServiceModel.Description
Assembly:  System.ServiceModel (in System.ServiceModel.dll)

public:
property Dictionary<Object^, Object^>^ State {
	Dictionary<Object^, Object^>^ get();
}

Property Value

Type: System.Collections.Generic::Dictionary<Object^, Object^>^

A dictionary of objects keyed by type.

Use the State property to add or remove objects used in the importing of metadata.

The following example shows the use of the State property to add a custom System.Runtime.Serialization::XsdDataContractImporter to import data structures in a particular way.

static void GenerateCSCodeForService(EndpointAddress metadataAddress, string outputFile)
{
    MetadataExchangeClient mexClient = new MetadataExchangeClient(metadataAddress);
    mexClient.ResolveMetadataReferences = true;
    MetadataSet metaDocs = mexClient.GetMetadata();

	WsdlImporter importer = new WsdlImporter(metaDocs);
    ServiceContractGenerator generator = new ServiceContractGenerator();

    // Add our custom DCAnnotationSurrogate 
    // to write XSD annotations into the comments.
    object dataContractImporter;
    XsdDataContractImporter xsdDCImporter;
    if (!importer.State.TryGetValue(typeof(XsdDataContractImporter), out dataContractImporter))
    {
      Console.WriteLine("Couldn't find the XsdDataContractImporter! Adding custom importer.");
      xsdDCImporter = new XsdDataContractImporter();
      xsdDCImporter.Options = new ImportOptions();
      importer.State.Add(typeof(XsdDataContractImporter), xsdDCImporter);
    }
    else
    {
      xsdDCImporter = (XsdDataContractImporter)dataContractImporter;
      if (xsdDCImporter.Options == null)
      {
        Console.WriteLine("There were no ImportOptions on the importer.");
        xsdDCImporter.Options = new ImportOptions();
      }
    }
    xsdDCImporter.Options.DataContractSurrogate = new DCAnnotationSurrogate();

    // Uncomment the following code if you are going to do your work programmatically rather than add 
    // the WsdlDocumentationImporters through a configuration file. 
    /*
    // The following code inserts a custom WsdlImporter without removing the other 
    // importers already in the collection.
    System.Collections.Generic.IEnumerable<IWsdlImportExtension> exts = importer.WsdlImportExtensions;
    System.Collections.Generic.List<IWsdlImportExtension> newExts 
      = new System.Collections.Generic.List<IWsdlImportExtension>();
    foreach (IWsdlImportExtension ext in exts)
    {
      Console.WriteLine("Default WSDL import extensions: {0}", ext.GetType().Name);
      newExts.Add(ext);
    }
    newExts.Add(new WsdlDocumentationImporter());
    System.Collections.Generic.IEnumerable<IPolicyImportExtension> polExts = importer.PolicyImportExtensions;
    importer = new WsdlImporter(metaDocs, polExts, newExts);
    */

    System.Collections.ObjectModel.Collection<ContractDescription> contracts 
      = importer.ImportAllContracts();
    importer.ImportAllEndpoints();
	foreach (ContractDescription contract in contracts)
	{
		generator.GenerateServiceContractType(contract);
	}
    if (generator.Errors.Count != 0)
      throw new Exception("There were errors during code compilation.");

    // Write the code dom
    System.CodeDom.Compiler.CodeGeneratorOptions options 
      = new System.CodeDom.Compiler.CodeGeneratorOptions();
	options.BracingStyle = "C";
	System.CodeDom.Compiler.CodeDomProvider codeDomProvider 
      = System.CodeDom.Compiler.CodeDomProvider.CreateProvider("C#");
	System.CodeDom.Compiler.IndentedTextWriter textWriter 
      = new System.CodeDom.Compiler.IndentedTextWriter(new System.IO.StreamWriter(outputFile));
	codeDomProvider.GenerateCodeFromCompileUnit(
      generator.TargetCompileUnit, textWriter, options
    );
	textWriter.Close();
}

.NET Framework
Available since 3.0
Return to top
Show: