2using System.Collections.Generic;
4using System.Xml.Serialization;
5using LotSizingDataModel.Core.Common;
7using LotSizingDataModel.Solution.Common;
57[XmlType(TypeName =
"solutionMethodDefinition")]
60 private string _methodCode =
63 private string _name =
66 private string _methodVersion =
69 private SolutionMethodKind _methodKind =
72 private string _description =
75 private bool _isEnabled =
78 private int _priority;
80 private bool _supportsAnyProblemFamily;
82 private bool _supportsAnyProductStructure;
84 private bool _supportsUnclassifiedProblems;
86 private bool _supportsAmbiguousClassifications;
88 private bool _supportsCompleteProblems =
91 private bool _supportsRelaxations;
93 private bool _supportsSubproblems;
95 private bool _canProduceFeasibleSolution =
98 private bool _canProveOptimality;
100 private bool _canProvideLowerBound;
102 private bool _canProvideUpperBound =
105 private int? _maximumItemCount;
107 private int? _maximumPlanningHorizon;
109 private int? _maximumPlantCount;
111 private int? _maximumWorkCenterCount;
113 private int? _maximumWarehouseCount;
115 private int? _maximumSupplierCount;
117 private int? _maximumTransportResourceCount;
119 private int? _maximumBillOfMaterialsRelationshipCount;
121 private int? _maximumProductStructureDepth;
123 private int? _recommendedMaximumItemCount;
125 private int? _recommendedMaximumPlanningHorizon;
128 _recommendedMaximumBillOfMaterialsRelationshipCount;
130 private int? _recommendedMaximumProductStructureDepth;
132 private string _implementationName =
135 private string _implementationVersion =
138 private string _comment =
170 SolutionMethodKind methodKind)
172 if (
string.IsNullOrWhiteSpace(methodCode))
174 throw new ArgumentException(
175 "A solution-method code is required.",
179 if (
string.IsNullOrWhiteSpace(name))
181 throw new ArgumentException(
182 "A solution-method name is required.",
205 [XmlAttribute(
"methodCode")]
213 NormalizeCode(value)))
230 [XmlAttribute(
"name")]
238 value?.Trim() ??
string.Empty))
260 [XmlAttribute(
"methodVersion")]
263 get => _methodVersion;
268 value?.Trim() ??
string.Empty))
280 [XmlAttribute(
"methodKind")]
293 [XmlElement(
"description")]
301 value?.Trim() ??
string.Empty))
313 [XmlAttribute(
"isEnabled")]
336 [XmlAttribute(
"priority")]
354 [XmlAttribute(
"supportsAnyProblemFamily")]
357 get => _supportsAnyProblemFamily;
361 ref _supportsAnyProblemFamily,
364 NotifyDefinitionValidityProperties();
378 [XmlAttribute(
"supportsAnyProductStructure")]
381 get => _supportsAnyProductStructure;
385 ref _supportsAnyProductStructure,
388 NotifyDefinitionValidityProperties();
398 [XmlAttribute(
"supportsUnclassifiedProblems")]
401 get => _supportsUnclassifiedProblems;
403 ref _supportsUnclassifiedProblems,
412 [XmlAttribute(
"supportsAmbiguousClassifications")]
415 get => _supportsAmbiguousClassifications;
417 ref _supportsAmbiguousClassifications,
425 [XmlAttribute(
"supportsCompleteProblems")]
428 get => _supportsCompleteProblems;
432 ref _supportsCompleteProblems,
435 NotifyScopeProperties();
444 [XmlAttribute(
"supportsRelaxations")]
447 get => _supportsRelaxations;
451 ref _supportsRelaxations,
454 NotifyScopeProperties();
463 [XmlAttribute(
"supportsSubproblems")]
466 get => _supportsSubproblems;
470 ref _supportsSubproblems,
473 NotifyScopeProperties();
483 [XmlAttribute(
"canProduceFeasibleSolution")]
486 get => _canProduceFeasibleSolution;
488 ref _canProduceFeasibleSolution,
496 [XmlAttribute(
"canProveOptimality")]
499 get => _canProveOptimality;
501 ref _canProveOptimality,
509 [XmlAttribute(
"canProvideLowerBound")]
512 get => _canProvideLowerBound;
514 ref _canProvideLowerBound,
526 [XmlAttribute(
"canProvideUpperBound")]
529 get => _canProvideUpperBound;
531 ref _canProvideUpperBound,
545 [XmlArray(
"supportedProblemTypeCodes")]
546 [XmlArrayItem(
"problemTypeCode")]
554 [XmlArray(
"preferredProblemTypeCodes")]
555 [XmlArrayItem(
"problemTypeCode")]
567 [XmlArray(
"supportedProductStructureTypes")]
568 [XmlArrayItem(
"productStructureType")]
569 public List<ProductStructureType>
582 [XmlArray(
"requiredFeatureCodes")]
583 [XmlArrayItem(
"featureCode")]
596 [XmlArray(
"supportedFeatureCodes")]
597 [XmlArrayItem(
"featureCode")]
606 [XmlArray(
"partiallySupportedFeatureCodes")]
607 [XmlArrayItem(
"featureCode")]
617 [XmlArray(
"unsupportedFeatureCodes")]
618 [XmlArrayItem(
"featureCode")]
626 [XmlArray(
"preferredFeatureCodes")]
627 [XmlArrayItem(
"featureCode")]
635 [XmlElement(
"maximumItemCount", IsNullable =
true)]
638 get => _maximumItemCount;
640 ref _maximumItemCount,
649 [XmlElement(
"maximumPlanningHorizon", IsNullable =
true)]
652 get => _maximumPlanningHorizon;
654 ref _maximumPlanningHorizon,
663 [XmlElement(
"maximumPlantCount", IsNullable =
true)]
666 get => _maximumPlantCount;
668 ref _maximumPlantCount,
677 [XmlElement(
"maximumWorkCenterCount", IsNullable =
true)]
680 get => _maximumWorkCenterCount;
682 ref _maximumWorkCenterCount,
691 [XmlElement(
"maximumWarehouseCount", IsNullable =
true)]
694 get => _maximumWarehouseCount;
696 ref _maximumWarehouseCount,
705 [XmlElement(
"maximumSupplierCount", IsNullable =
true)]
708 get => _maximumSupplierCount;
710 ref _maximumSupplierCount,
720 "maximumTransportResourceCount",
724 get => _maximumTransportResourceCount;
726 ref _maximumTransportResourceCount,
737 "maximumBillOfMaterialsRelationshipCount",
741 get => _maximumBillOfMaterialsRelationshipCount;
743 ref _maximumBillOfMaterialsRelationshipCount,
754 "maximumProductStructureDepth",
758 get => _maximumProductStructureDepth;
760 ref _maximumProductStructureDepth,
774 "recommendedMaximumItemCount",
778 get => _recommendedMaximumItemCount;
779 set => SetRecommendedLimit(
780 ref _recommendedMaximumItemCount,
790 "recommendedMaximumPlanningHorizon",
794 get => _recommendedMaximumPlanningHorizon;
795 set => SetRecommendedLimit(
796 ref _recommendedMaximumPlanningHorizon,
806 "recommendedMaximumBillOfMaterialsRelationshipCount",
812 _recommendedMaximumBillOfMaterialsRelationshipCount;
814 set => SetRecommendedLimit(
816 _recommendedMaximumBillOfMaterialsRelationshipCount,
827 "recommendedMaximumProductStructureDepth",
831 get => _recommendedMaximumProductStructureDepth;
832 set => SetRecommendedLimit(
833 ref _recommendedMaximumProductStructureDepth,
848 [XmlElement(
"implementationName")]
851 get => _implementationName;
855 ref _implementationName,
856 value?.Trim() ??
string.Empty))
868 [XmlAttribute(
"implementationVersion")]
871 get => _implementationVersion;
875 ref _implementationVersion,
876 value?.Trim() ??
string.Empty))
888 [XmlArray(
"references")]
889 [XmlArrayItem(
"reference")]
896 [XmlElement(
"comment")]
904 value?.Trim() ??
string.Empty))
918 !
string.IsNullOrWhiteSpace(
927 !
string.IsNullOrWhiteSpace(
936 !
string.IsNullOrWhiteSpace(
945 !
string.IsNullOrWhiteSpace(
954 SupportedProblemTypeCodes.Count > 0;
962 PreferredProblemTypeCodes.Count > 0;
970 SupportedProductStructureTypes.Count > 0;
978 RequiredFeatureCodes.Count > 0 ||
979 SupportedFeatureCodes.Count > 0 ||
980 PartiallySupportedFeatureCodes.Count > 0 ||
981 UnsupportedFeatureCodes.Count > 0 ||
982 PreferredFeatureCodes.Count > 0;
1000 MaximumItemCount.HasValue ||
1001 MaximumPlanningHorizon.HasValue ||
1002 MaximumPlantCount.HasValue ||
1003 MaximumWorkCenterCount.HasValue ||
1004 MaximumWarehouseCount.HasValue ||
1005 MaximumSupplierCount.HasValue ||
1006 MaximumTransportResourceCount.HasValue ||
1007 MaximumBillOfMaterialsRelationshipCount.HasValue ||
1016 RecommendedMaximumItemCount.HasValue ||
1017 RecommendedMaximumPlanningHorizon.HasValue ||
1028 !
string.IsNullOrWhiteSpace(
1030 !
string.IsNullOrWhiteSpace(
1039 References.Count > 0;
1047 !
string.IsNullOrWhiteSpace(
1082 string problemTypeCode)
1089 return ContainsCode(
1106 string problemTypeCode)
1108 return ContainsCode(
1131 productStructureType);
1171 return ContainsCode(
1189 return ContainsCode(
1201 IEnumerable<string> problemTypeCodes)
1203 ReplaceCodeCollection(
1207 NotifyProblemTypeProperties();
1217 IEnumerable<string> problemTypeCodes)
1219 ReplaceCodeCollection(
1223 NotifyProblemTypeProperties();
1234 IEnumerable<ProductStructureType>
1235 productStructureTypes)
1237 ArgumentNullException.ThrowIfNull(
1238 productStructureTypes);
1241 productStructureTypes
1260 NotifyDefinitionValidityProperties();
1270 IEnumerable<string> featureCodes)
1272 ReplaceFeatureCodeCollection(
1276 NotifyFeatureProperties();
1286 IEnumerable<string> featureCodes)
1288 ReplaceFeatureCodeCollection(
1292 NotifyFeatureProperties();
1302 IEnumerable<string> featureCodes)
1304 ReplaceFeatureCodeCollection(
1308 NotifyFeatureProperties();
1318 IEnumerable<string> featureCodes)
1320 ReplaceFeatureCodeCollection(
1324 NotifyFeatureProperties();
1334 IEnumerable<string> featureCodes)
1336 ReplaceFeatureCodeCollection(
1340 NotifyFeatureProperties();
1351 IEnumerable<string> references)
1353 ArgumentNullException.ThrowIfNull(
1356 string[] normalizedReferences =
1360 !
string.IsNullOrWhiteSpace(
1366 StringComparer.OrdinalIgnoreCase)
1370 StringComparer.OrdinalIgnoreCase)
1376 normalizedReferences);
1405 !
string.IsNullOrWhiteSpace(
1411 StringComparer.OrdinalIgnoreCase)
1415 StringComparer.OrdinalIgnoreCase)
1435 "The solution-method code is missing.");
1441 "The solution-method name is missing.");
1447 "The solution method does not support a " +
1448 "complete problem, relaxation or subproblem.");
1456 "The method does not declare any supported " +
1457 "problem family and is not marked as generic.");
1464 "The method does not declare any supported " +
1465 "product structure.");
1468 ValidateStringCollection(
1470 "supported problem-family code",
1473 ValidateStringCollection(
1475 "preferred problem-family code",
1478 ValidateStringCollection(
1480 "required feature code",
1483 ValidateStringCollection(
1485 "supported feature code",
1488 ValidateStringCollection(
1490 "partially supported feature code",
1493 ValidateStringCollection(
1495 "unsupported feature code",
1498 ValidateStringCollection(
1500 "preferred feature code",
1503 ValidateProductStructureCollection(
1506 ValidateProblemTypeRelationships(
1509 ValidateFeatureRelationships(
1512 ValidateRecommendedLimits(
1517 StringComparer.Ordinal)
1521 StringComparer.Ordinal)
1534 IReadOnlyList<string> errors =
1537 if (errors.Count == 0)
1542 throw new InvalidOperationException(
1543 "The solution-method definition is invalid:" +
1544 Environment.NewLine +
1546 Environment.NewLine,
1555 string familyDescription =
1557 ?
"any problem family"
1558 : $
"{SupportedProblemTypeCodes.Count} " +
1559 "supported family code(s)";
1562 $
"{MethodCode} — {Name}; " +
1564 $
"{familyDescription}";
1567 private static string NormalizeCode(
1570 return string.IsNullOrWhiteSpace(value)
1572 : value.Trim().ToUpperInvariant();
1575 private static bool ContainsCode(
1576 IEnumerable<string> codes,
1579 if (
string.IsNullOrWhiteSpace(code))
1584 string normalizedCode =
1592 StringComparison.OrdinalIgnoreCase));
1595 private static void ReplaceCodeCollection(
1596 ICollection<string> destination,
1597 IEnumerable<string> source)
1599 ArgumentNullException.ThrowIfNull(source);
1601 string[] normalizedCodes =
1605 !
string.IsNullOrWhiteSpace(code))
1609 StringComparer.OrdinalIgnoreCase)
1613 StringComparer.OrdinalIgnoreCase)
1616 destination.Clear();
1618 foreach (
string code
in normalizedCodes)
1620 destination.Add(code);
1624 private static void ReplaceFeatureCodeCollection(
1625 ICollection<string> destination,
1626 IEnumerable<string> source)
1628 ArgumentNullException.ThrowIfNull(source);
1630 string[] normalizedCodes =
1634 !
string.IsNullOrWhiteSpace(code))
1639 StringComparer.OrdinalIgnoreCase)
1643 StringComparer.OrdinalIgnoreCase)
1646 destination.Clear();
1648 foreach (
string code
in normalizedCodes)
1650 destination.Add(code);
1654 private static void ValidateStringCollection(
1655 IEnumerable<string> values,
1656 string valueDescription,
1657 ICollection<string> errors)
1659 string[] materializedValues =
1662 if (materializedValues.Any(
1664 string.IsNullOrWhiteSpace(value)))
1667 $
"Every {valueDescription} must be " +
1671 string[] duplicateValues =
1675 !
string.IsNullOrWhiteSpace(value))
1679 StringComparer.OrdinalIgnoreCase)
1689 StringComparer.OrdinalIgnoreCase)
1692 if (duplicateValues.Length > 0)
1695 $
"Duplicate {valueDescription} values: " +
1703 private void ValidateProductStructureCollection(
1704 ICollection<string> errors)
1709 productStructureType =>
1710 productStructureType)
1718 productStructureType =>
1719 productStructureType)
1722 if (duplicateTypes.Length > 0)
1725 "Duplicate supported product-structure " +
1737 "Unknown cannot be declared as a supported " +
1738 "product-structure type.");
1742 private void ValidateProblemTypeRelationships(
1743 ICollection<string> errors)
1750 string[] unsupportedPreferredCodes =
1760 StringComparer.OrdinalIgnoreCase)
1763 if (unsupportedPreferredCodes.Length > 0)
1766 "Preferred problem-family codes must also be " +
1770 unsupportedPreferredCodes) +
1775 private void ValidateFeatureRelationships(
1776 ICollection<string> errors)
1789 "partially supported",
1803 "partially supported",
1817 "partially supported",
1821 private void ValidateRecommendedLimits(
1822 ICollection<string> errors)
1824 ValidateRecommendedLimit(
1830 ValidateRecommendedLimit(
1836 ValidateRecommendedLimit(
1839 "bill-of-materials relationship count",
1842 ValidateRecommendedLimit(
1845 "product-structure depth",
1849 private static void ValidateRecommendedLimit(
1850 int? recommendedLimit,
1852 string limitDescription,
1853 ICollection<string> errors)
1855 if (recommendedLimit.HasValue &&
1856 hardLimit.HasValue &&
1857 recommendedLimit.Value >
1861 $
"The recommended maximum " +
1862 $
"{limitDescription} cannot exceed its hard " +
1867 private static void AddOverlapError(
1868 IEnumerable<string> firstCollection,
1869 IEnumerable<string> secondCollection,
1870 string firstDescription,
1871 string secondDescription,
1872 ICollection<string> errors)
1874 string[] overlappingCodes =
1878 StringComparer.OrdinalIgnoreCase)
1882 StringComparer.OrdinalIgnoreCase)
1885 if (overlappingCodes.Length == 0)
1891 $
"Feature codes cannot be both " +
1892 $
"{firstDescription} and {secondDescription}: " +
1899 private void SetHardLimit(
1902 string propertyName)
1904 ValidatePositiveNullableLimit(
1916 NotifyDefinitionValidityProperties();
1920 private void SetRecommendedLimit(
1923 string propertyName)
1925 ValidatePositiveNullableLimit(
1937 NotifyDefinitionValidityProperties();
1941 private static void ValidatePositiveNullableLimit(
1943 string parameterName)
1945 if (value.HasValue &&
1948 throw new ArgumentOutOfRangeException(
1951 "A method size limit must be strictly " +
1952 "positive when specified.");
1956 private void NotifyProblemTypeProperties()
1970 NotifyDefinitionValidityProperties();
1973 private void NotifyFeatureProperties()
1993 NotifyDefinitionValidityProperties();
1996 private void NotifyScopeProperties()
2001 NotifyDefinitionValidityProperties();
2004 private void NotifyDefinitionValidityProperties()
void ReplaceSupportedFeatureCodes(IEnumerable< string > featureCodes)
Replaces the explicitly supported feature codes.
bool PrefersProblemTypeCode(string problemTypeCode)
Determines whether this method identifies a problem family as particularly appropriate.
string Comment
Gets or sets an optional explanatory comment.
override string ToString()
bool HasRecommendedSizeLimits
Gets a value indicating whether at least one recommended size limit has been specified.
List< string > RequiredFeatureCodes
Gets the feature codes that must be active for the method to be applicable.
bool HasReferences
Gets a value indicating whether at least one reference has been recorded.
List< string > PreferredFeatureCodes
Gets the feature codes that make the method particularly attractive when they are active.
bool HasMethodCode
Gets a value indicating whether a stable method code has been recorded.
List< string > PartiallySupportedFeatureCodes
Gets the feature codes supported only through an adaptation, approximation, decomposition or implemen...
int? MaximumTransportResourceCount
Gets or sets the hard maximum number of transport resources accepted by the method.
List< string > SupportedFeatureCodes
Gets the active feature codes explicitly supported by the method.
List< ProductStructureType > SupportedProductStructureTypes
Gets the product structures supported by the method.
void ReplaceUnsupportedFeatureCodes(IEnumerable< string > featureCodes)
Replaces the unsupported feature codes.
bool SupportsSubproblems
Gets or sets a value indicating whether the method can solve subproblems extracted from a complete in...
int? MaximumSupplierCount
Gets or sets the hard maximum number of suppliers accepted by the method.
bool HasSupportedScope
Gets a value indicating whether the method supports at least one problem scope.
string MethodCode
Gets or sets the stable code identifying the solution method.
List< string > SupportedProblemTypeCodes
Gets the problem-family codes directly supported by the method.
List< string > PreferredProblemTypeCodes
Gets the problem-family codes for which the method is considered particularly appropriate.
string ImplementationVersion
Gets or sets the version of the associated method implementation.
bool SupportsAnyProductStructure
Gets or sets a value indicating whether the method supports any valid product structure.
void EnsureValid()
Validates the method definition and throws an exception when at least one error is found.
bool HasName
Gets a value indicating whether a human-readable name has been recorded.
SolutionMethodDefinition(string methodCode, string name, SolutionMethodKind methodKind)
Initializes a solution-method definition.
bool SupportsCompleteProblems
Gets or sets a value indicating whether the method can solve a complete problem instance.
int? RecommendedMaximumItemCount
Gets or sets the recommended maximum number of items for effective use of the method.
void ReplacePreferredFeatureCodes(IEnumerable< string > featureCodes)
Replaces the preferred feature codes.
int? MaximumPlantCount
Gets or sets the hard maximum number of plants accepted by the method.
string Description
Gets or sets a human-readable description of the method and its principal assumptions.
bool SupportsAmbiguousClassifications
Gets or sets a value indicating whether the method may be evaluated when the problem-family classific...
int? RecommendedMaximumBillOfMaterialsRelationshipCount
Gets or sets the recommended maximum number of bill-of-materials relationships.
bool CanProvideUpperBound
Gets or sets a value indicating whether the method can produce a valid upper bound for a minimization...
bool SupportsProblemTypeCode(string problemTypeCode)
Determines whether this method supports a problem family code.
bool SupportsUnclassifiedProblems
Gets or sets a value indicating whether the method may be evaluated for a problem that has not been a...
string ImplementationName
Gets or sets the name of an implementation associated with this method definition.
void ReplaceSupportedProblemTypeCodes(IEnumerable< string > problemTypeCodes)
Replaces the supported problem-family codes.
bool ExcludesFeatureCode(string featureCode)
Determines whether a feature is explicitly unsupported.
bool CanProduceFeasibleSolution
Gets or sets a value indicating whether the method can produce a feasible solution to the problem sco...
bool IsEnabled
Gets or sets a value indicating whether this method definition is enabled in the catalog.
bool CanProvideLowerBound
Gets or sets a value indicating whether the method can produce a valid lower bound for a minimization...
bool HasFeatureRules
Gets a value indicating whether the method has at least one explicit feature capability or restrictio...
SolutionMethodKind MethodKind
Gets or sets the general category of the solution method.
int? MaximumBillOfMaterialsRelationshipCount
Gets or sets the hard maximum number of bill-of-materials relationships accepted by the method.
List< string > References
Gets the documentary or bibliographic references associated with the method.
bool SupportsRelaxations
Gets or sets a value indicating whether the method can solve a relaxation of a complete problem.
bool SupportsProductStructureType(ProductStructureType productStructureType)
Determines whether this method supports a given product-structure type.
void ReplaceSupportedProductStructureTypes(IEnumerable< ProductStructureType > productStructureTypes)
Replaces the product structures supported by the method.
bool HasDescription
Gets a value indicating whether a description has been recorded.
int Priority
Gets or sets the catalog priority of the method.
void ReplaceRequiredFeatureCodes(IEnumerable< string > featureCodes)
Replaces the required feature codes.
bool IsValidDefinition
Gets a value indicating whether the method definition contains the minimum information required for e...
bool SupportsAnyProblemFamily
Gets or sets a value indicating whether the method is independent from a specific classified problem ...
int? RecommendedMaximumProductStructureDepth
Gets or sets the recommended maximum product-structure depth.
int? MaximumWarehouseCount
Gets or sets the hard maximum number of warehouses accepted by the method.
bool HasSupportedProductStructureTypes
Gets a value indicating whether the method explicitly supports at least one product-structure type.
void ReplacePartiallySupportedFeatureCodes(IEnumerable< string > featureCodes)
Replaces the partially supported feature codes.
bool CanProveOptimality
Gets or sets a value indicating whether the method can prove optimality under its stated assumptions.
int? MaximumPlanningHorizon
Gets or sets the hard maximum number of planning periods accepted by the method.
bool HasPreferredProblemTypes
Gets a value indicating whether the method identifies at least one preferred problem family.
bool HasMethodVersion
Gets a value indicating whether a method-definition version has been recorded.
bool HasHardSizeLimits
Gets a value indicating whether at least one hard size limit has been specified.
void ReplacePreferredProblemTypeCodes(IEnumerable< string > problemTypeCodes)
Replaces the preferred problem-family codes.
bool HasSupportedProblemTypes
Gets a value indicating whether the method explicitly supports at least one problem family.
int? MaximumProductStructureDepth
Gets or sets the hard maximum product-structure depth accepted by the method.
int? RecommendedMaximumPlanningHorizon
Gets or sets the recommended maximum planning horizon for effective use of the method.
bool SupportsFeatureCode(string featureCode)
Determines whether an active feature is explicitly supported by the method.
void ReplaceReferences(IEnumerable< string > references)
Replaces the documentary or bibliographic references associated with the method.
List< string > UnsupportedFeatureCodes
Gets the active feature codes that make the method incompatible with the complete problem.
SolutionMethodDefinition()
Initializes an empty solution-method definition.
int? MaximumWorkCenterCount
Gets or sets the hard maximum number of work centers accepted by the method.
string Name
Gets or sets the human-readable name of the method.
bool HasImplementationInformation
Gets a value indicating whether implementation information has been recorded.
IReadOnlyList< string > Validate()
Validates the structural consistency of this method definition.
IReadOnlyList< string > GetAllFeatureCodes()
Returns the distinct feature codes referenced by this method definition.
bool CanBeEvaluated
Gets a value indicating whether this method can be considered by the solution-method advisor.
string MethodVersion
Gets or sets the version of the method definition.
int? MaximumItemCount
Gets or sets the hard maximum number of items accepted by the method or its current implementation.
bool HasComment
Gets a value indicating whether an explanatory comment has been recorded.
bool PartiallySupportsFeatureCode(string featureCode)
Determines whether a feature is only partially supported.
ProductStructureType
Identifies the structural category of a product bill-of-materials graph.