다음을 통해 공유


방법: UML API와의 관계 탐색

Visual Studio Ultimate에서 모델은 여러 종류의 관계에 따라 서로 연결된 요소로 구성됩니다. 이 항목에서는 프로그램 코드에서 모델을 탐색하는 방법에 대해 설명합니다.

관계 트래버스

임의의 관계

GetRelatedElements<T>()를 사용하면 지정된 요소에 연결되어 있는 모든 요소를 찾을 수 있습니다. 모든 종류의 관계를 트래버스하려면 T를 IRelationship으로 설정하고, 해당 형식만 트래버스하려면 IAssociation과 같이 좀 더 구체적인 형식을 사용합니다.

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

GetRelatedLinks<T>()를 사용하면 요소에 연결되어 있는 모든 관계를 찾을 수 있습니다.

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

연결

연결은 각각 분류자에 속해 있는 두 속성 간의 관계입니다.

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));
}

 일반화 및 인식

일반화의 반대쪽 끝에 액세스합니다.

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);
 

종속성

/// 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);
 

작업 가장자리

/// 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);
 

연결선(어셈블리 및 위임)

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

메시지 및 수명선

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
 

패키지 가져오기

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

사용 사례 확장 및 포함

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

 관계 열거

여러 값을 반환하는 모든 UML 모델 속성은 IEnumerable<> 인터페이스를 따릅니다. 즉, LINQ 쿼리 식System.Linq 네임스페이스에 정의된 확장 메서드를 사용할 수 있습니다.

예를 들면 다음과 같습니다.

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

참고 항목

개념

UML 모델 및 다이어그램 확장

방법: UML 모델 탐색