// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Reflection; using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Mvc.ModelBinding.Metadata { /// /// A key type which identifies a . /// public struct ModelMetadataIdentity { /// /// Creates a for the provided model . /// /// The model . /// A . public static ModelMetadataIdentity ForType([NotNull] Type modelType) { return new ModelMetadataIdentity() { ModelType = modelType, }; } /// /// Creates a for the provided . /// /// The model parameter. /// A . public static ModelMetadataIdentity ForParameter([NotNull] ParameterInfo parameterInfo) { return new ModelMetadataIdentity() { ParameterInfo = parameterInfo, Name = parameterInfo.Name, ModelType = parameterInfo.ParameterType, }; } /// /// Creates a for the provided property. /// /// The model type. /// The name of the property. /// The container type of the model property. /// A . public static ModelMetadataIdentity ForProperty( [NotNull] Type modelType, string name, [NotNull] Type containerType) { if (string.IsNullOrEmpty(name)) { throw new ArgumentException(Resources.ArgumentCannotBeNullOrEmpty, nameof(name)); } return new ModelMetadataIdentity() { ModelType = modelType, Name = name, ContainerType = containerType, }; } /// /// Gets the defining the model property respresented by the current /// instance, or null if the current instance does not represent a property. /// public Type ContainerType { get; private set; } /// /// Gets the represented by the current instance, or null /// if the current instance does not represent a parameter. /// public ParameterInfo ParameterInfo { get; private set; } /// /// Gets the represented by the current instance. /// public Type ModelType { get; private set; } /// /// Gets a value indicating the kind of metadata represented by the current instance. /// public ModelMetadataKind MetadataKind { get { if (ContainerType != null && Name != null) { return ModelMetadataKind.Property; } else { return ModelMetadataKind.Type; } } } /// /// Gets the name of the current instance if it represents a parameter or property, or null if /// the current instance represents a type. /// public string Name { get; private set; } } }