diff --git a/src/Microsoft.AspNet.Mvc.ModelBinding/Metadata/DefaultModelMetadataProvider.cs b/src/Microsoft.AspNet.Mvc.ModelBinding/Metadata/DefaultModelMetadataProvider.cs index efa50bdb75..a27e563988 100644 --- a/src/Microsoft.AspNet.Mvc.ModelBinding/Metadata/DefaultModelMetadataProvider.cs +++ b/src/Microsoft.AspNet.Mvc.ModelBinding/Metadata/DefaultModelMetadataProvider.cs @@ -167,10 +167,49 @@ namespace Microsoft.AspNet.Mvc.ModelBinding.Metadata private class TypeCache : ConcurrentDictionary { + public TypeCache() + : base(ModelMetadataIdentityComparer.Instance) + { + } } private class PropertiesCache : ConcurrentDictionary { + public PropertiesCache() + : base(ModelMetadataIdentityComparer.Instance) + { + } + } + + private class ModelMetadataIdentityComparer : IEqualityComparer + { + public static readonly ModelMetadataIdentityComparer Instance = new ModelMetadataIdentityComparer(); + + public bool Equals(ModelMetadataIdentity x, ModelMetadataIdentity y) + { + return + x.ContainerType == y.ContainerType && + x.ModelType == y.ModelType && + x.Name == y.Name; + } + + public int GetHashCode(ModelMetadataIdentity obj) + { + var hash = 17; + hash = hash * 23 + obj.ModelType.GetHashCode(); + + if (obj.ContainerType != null) + { + hash = hash * 23 + obj.ContainerType.GetHashCode(); + } + + if (obj.Name != null) + { + hash = hash * 23 + obj.Name.GetHashCode(); + } + + return hash; + } } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Mvc.ModelBinding/Metadata/ModelMetadataIdentity.cs b/src/Microsoft.AspNet.Mvc.ModelBinding/Metadata/ModelMetadataIdentity.cs index ddbeefdd26..e77521003d 100644 --- a/src/Microsoft.AspNet.Mvc.ModelBinding/Metadata/ModelMetadataIdentity.cs +++ b/src/Microsoft.AspNet.Mvc.ModelBinding/Metadata/ModelMetadataIdentity.cs @@ -2,7 +2,6 @@ // 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 @@ -25,21 +24,6 @@ namespace Microsoft.AspNet.Mvc.ModelBinding.Metadata }; } - /// - /// 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. /// @@ -71,12 +55,6 @@ namespace Microsoft.AspNet.Mvc.ModelBinding.Metadata /// 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. /// diff --git a/test/Microsoft.AspNet.Mvc.ModelBinding.Test/Metadata/DefaultModelMetadataTest.cs b/test/Microsoft.AspNet.Mvc.ModelBinding.Test/Metadata/DefaultModelMetadataTest.cs index f1e624824d..b1c0bba34f 100644 --- a/test/Microsoft.AspNet.Mvc.ModelBinding.Test/Metadata/DefaultModelMetadataTest.cs +++ b/test/Microsoft.AspNet.Mvc.ModelBinding.Test/Metadata/DefaultModelMetadataTest.cs @@ -106,30 +106,6 @@ namespace Microsoft.AspNet.Mvc.ModelBinding.Metadata Assert.Equal(typeof(Exception), metadata.ContainerType); } - [Fact] - public void CreateMetadataForParameter() - { - // Arrange - var provider = new EmptyModelMetadataProvider(); - var detailsProvider = new EmptyCompositeMetadataDetailsProvider(); - - var methodInfo = GetType().GetMethod( - "ActionMethod", - BindingFlags.Instance | BindingFlags.NonPublic); - - var parameterInfo = methodInfo.GetParameters().Where(p => p.Name == "input").Single(); - - var key = ModelMetadataIdentity.ForParameter(parameterInfo); - var cache = new DefaultMetadataDetailsCache(key, new object[0]); - - // Act - var metadata = new DefaultModelMetadata(provider, detailsProvider, cache); - - Assert.Equal(typeof(string), metadata.ModelType); - Assert.Equal("input", metadata.PropertyName); - Assert.Null(metadata.ContainerType); - } - [Theory] [InlineData(typeof(string))] [InlineData(typeof(IDisposable))]