Share via


Cómo: Navegar por las relaciones con la API de UML

En Visual Studio Ultimate, un modelo se compone de elementos vinculados entre sí mediante diferentes tipos de relaciones.En este tema se describe cómo navegar por el modelo en código de programa.

Recorrer las relaciones

Ee330927.collapse_all(es-es,VS.110).gifCualquier relación

Utilice GetRelatedElements<T>() para buscar todos los elementos conectados a un elemento especificado.Establezca T en IRelationship para recorrer las relaciones de todo tipo o utilice un tipo más específico, como IAssociation, para recorrer exclusivamente ese tipo.

IElement anElement;
// Select all elements related to anElement.
Context.CurrentDiagram.SelectShapes (
   anElement.GetRelatedElements<IRelationship>()
    .SelectMany(e=>e.Shapes()).ToArray());

Use GetRelatedLinks<T>() para buscar todas las relaciones conectadas a un elemento.

// Process all relationships connected to an element.
foreach (IRelationship relationship in 
   anElement.GetRelatedLinks<IRelationship>())
{
  Debug.Assert(relationship.SourceElement == anElement
      || relationship.TargetElement == anElement);
}

Ee330927.collapse_all(es-es,VS.110).gifAsociación

Una asociación es una relación entre dos propiedades, cada una de los cuales pertenece a un clasificador.

IClassifier classifier; // class, interface, component, actor, ...
// Get all the associations sourced from this classifier
foreach (IProperty p in classifier.GetOutgoingAssociationEnds())
{
  // p represents the end further end of an association.
  IType oppositeElement = p.Type; 
    // The type to which this association connects classifier
  
  IProperty oppositeProperty = p.Opposite;
    // The nearer end of the association.
  Debug.Assert(oppositeProperty.Type == classifier);
  IAssociation association = p.Association;
  Debug.Assert(association.MemberEnds.Contains(p)
     && association.MemberEnds.Contains(oppositeProperty));
}

Ee330927.collapse_all(es-es,VS.110).gif Generalización y realización

Tiene acceso a los extremos opuestos de la generalización:

foreach (IClassifier supertype in classifier.Generals) {…}
foreach (IClassifier subtype in classifier.GetSpecifics()) {…}
Access the relationship itself:
foreach (IGeneralization gen in classifier.Generalizations) 
{ Debug.Assert(classifier == gen.Specific); }

/// InterfaceRealization:
IEnumerable<IInterface> GetRealizedInterfaces
    (this IBehavioredClassifier classifier);
IEnumerable<IBehavioredClassifier> GetRealizingClassifiers
    (this IInterface interface);
 

Ee330927.collapse_all(es-es,VS.110).gifDependencia

/// Returns the elements depending on this element
IEnumerable<INamedElement> GetDependencyClients(this INamedElement element); 
/// Returns the elements this element depends on
IEnumerable<INamedElement> INamedElement GetDependencySuppliers(this INamedElement element);
 

Ee330927.collapse_all(es-es,VS.110).gifPerímetro de actividad

/// Returns the nodes targeted by edges outgoing from this one
IEnumerable<IActivityNode> GetActivityEdgeTargets(this IActivityNode node);
/// Returns the nodes sourcing edges incoming to this one
IEnumerable<IActivityNode> GetActivityEdgeSources(this IActivityNode node);
 

Ee330927.collapse_all(es-es,VS.110).gifConector (ensamblado y delegación)

/// Returns the elements connected via assembly 
/// or delegation to this one
IEnumerable<IConnectableElement> GetConnectedElements(this IConnectableElement element);
 

Ee330927.collapse_all(es-es,VS.110).gifMensajes y líneas de vida

IEnumerable<IMessage> GetAllOutgoingMessages(this ILifeline  lifeline); 
// both from lifeline and execution occurrences
IEnumerable<IMessage> GetAllIncomingMessages(this ILifeline  lifeline);
ILifeline GetSourceLifeline(this IMessage message); 
    // may return null for found messages
ILifeline GetTargetLifeline(this IMessage message);  
    // may return null for lost messages
 

Ee330927.collapse_all(es-es,VS.110).gifImportación de paquetes

IEnumerable<IPackage>GetImportedPackages(this INamespace namespace);
IEnumerable<INamespace> GetImportingNamespaces(this IPackage package);
 

Ee330927.collapse_all(es-es,VS.110).gifAmpliación e inclusión de casos de uso

IEnumerable<IUseCase>GetExtendedCases(this IUseCase usecase);
IEnumerable<IUseCase>GetExtendingCases(this IUseCase usecase);
IEnumerable<IUseCase>GetIncludedCases(this IUseCase usecase);
IEnumerable<IUseCase>GetIncludingCases(this IUseCase usecase);

 Enumerar relaciones

Todas las propiedades del modelo UML que devuelven varios valores son compatibles con la interfaz IEnumerable<>.Esto significa que puede utilizar Expresiones de consultas LINQ y los métodos de extensión definidos en el espacio de nombres System.Linq.

Por ejemplo:

from shape in     Context.CurrentDiagram.GetSelectedShapes<IClassifier>()
where shape.Color == System.Drawing.Color.Red
select shape.Element

Vea también

Conceptos

Ampliar modelos y diagramas UML

Cómo: Navegar por el modelo UML