Skip to content

Use the declared type to infer NullableContextOptions #15134

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Oct 20, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -883,10 +883,13 @@ protected ModelBindingMessageProvider() { }
public System.Type ModelType { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
public string Name { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
public System.Reflection.ParameterInfo ParameterInfo { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
public System.Reflection.PropertyInfo PropertyInfo { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
public bool Equals(Microsoft.AspNetCore.Mvc.ModelBinding.Metadata.ModelMetadataIdentity other) { throw null; }
public override bool Equals(object obj) { throw null; }
public static Microsoft.AspNetCore.Mvc.ModelBinding.Metadata.ModelMetadataIdentity ForParameter(System.Reflection.ParameterInfo parameter) { throw null; }
public static Microsoft.AspNetCore.Mvc.ModelBinding.Metadata.ModelMetadataIdentity ForParameter(System.Reflection.ParameterInfo parameter, System.Type modelType) { throw null; }
public static Microsoft.AspNetCore.Mvc.ModelBinding.Metadata.ModelMetadataIdentity ForProperty(System.Reflection.PropertyInfo propertyInfo, System.Type modelType, System.Type containerType) { throw null; }
[System.ObsoleteAttribute("This API is obsolete and may be removed in a future release.")]
public static Microsoft.AspNetCore.Mvc.ModelBinding.Metadata.ModelMetadataIdentity ForProperty(System.Type modelType, string name, System.Type containerType) { throw null; }
public static Microsoft.AspNetCore.Mvc.ModelBinding.Metadata.ModelMetadataIdentity ForType(System.Type modelType) { throw null; }
public override int GetHashCode() { throw null; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,14 @@ private ModelMetadataIdentity(
Type modelType,
string name = null,
Type containerType = null,
ParameterInfo parameterInfo = null)
ParameterInfo parameterInfo = null,
PropertyInfo propertyInfo = null)
{
ModelType = modelType;
Name = name;
ContainerType = containerType;
ParameterInfo = parameterInfo;
PropertyInfo = propertyInfo;
}

/// <summary>
Expand All @@ -47,6 +49,7 @@ public static ModelMetadataIdentity ForType(Type modelType)
/// <param name="name">The name of the property.</param>
/// <param name="containerType">The container type of the model property.</param>
/// <returns>A <see cref="ModelMetadataIdentity"/>.</returns>
[Obsolete("This API is obsolete and may be removed in a future release.")]
public static ModelMetadataIdentity ForProperty(
Type modelType,
string name,
Expand All @@ -70,6 +73,36 @@ public static ModelMetadataIdentity ForProperty(
return new ModelMetadataIdentity(modelType, name, containerType);
}

/// <summary>
/// Creates a <see cref="ModelMetadataIdentity"/> for the provided property.
/// </summary>
/// <param name="modelType">The model type.</param>
/// <param name="propertyInfo">The property.</param>
/// <param name="containerType">The container type of the model property.</param>
/// <returns>A <see cref="ModelMetadataIdentity"/>.</returns>
public static ModelMetadataIdentity ForProperty(
PropertyInfo propertyInfo,
Type modelType,
Type containerType)
{
if (propertyInfo == null)
{
throw new ArgumentNullException(nameof(propertyInfo));
}

if (modelType == null)
{
throw new ArgumentNullException(nameof(modelType));
}

if (containerType == null)
{
throw new ArgumentNullException(nameof(containerType));
}

return new ModelMetadataIdentity(modelType, propertyInfo.Name, containerType, propertyInfo: propertyInfo);
}

/// <summary>
/// Creates a <see cref="ModelMetadataIdentity"/> for the provided parameter.
/// </summary>
Expand Down Expand Up @@ -145,14 +178,21 @@ public ModelMetadataKind MetadataKind
/// </summary>
public ParameterInfo ParameterInfo { get; }

/// <summary>
/// Gets a descriptor for the property, or <c>null</c> if this instance
/// does not represent a property.
/// </summary>
public PropertyInfo PropertyInfo { get; }

/// <inheritdoc />
public bool Equals(ModelMetadataIdentity other)
{
return
ContainerType == other.ContainerType &&
ModelType == other.ModelType &&
Name == other.Name &&
ParameterInfo == other.ParameterInfo;
ParameterInfo == other.ParameterInfo &&
PropertyInfo == other.PropertyInfo;
}

/// <inheritdoc />
Expand All @@ -170,6 +210,7 @@ public override int GetHashCode()
hash.Add(ModelType);
hash.Add(Name, StringComparer.Ordinal);
hash.Add(ParameterInfo);
hash.Add(PropertyInfo);
return hash;
}
}
Expand Down
16 changes: 10 additions & 6 deletions src/Mvc/Mvc.Abstractions/test/ModelBinding/ModelMetadataTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -270,7 +270,8 @@ public void ContainerType_IsNull_ForParameter()
public void ContainerType_ReturnExpectedMetadata_ForProperty()
{
// Arrange & Act
var metadata = new TestModelMetadata(typeof(int), nameof(string.Length), typeof(string));
var property = typeof(string).GetProperty(nameof(string.Length));
var metadata = new TestModelMetadata(property, typeof(int), typeof(string));

// Assert
Assert.Equal(typeof(string), metadata.ContainerType);
Expand Down Expand Up @@ -308,7 +309,8 @@ public void Names_ReturnExpectedMetadata_ForParameter()
public void Names_ReturnExpectedMetadata_ForProperty()
{
// Arrange & Act
var metadata = new TestModelMetadata(typeof(int), nameof(string.Length), typeof(string));
var property = typeof(string).GetProperty(nameof(string.Length));
var metadata = new TestModelMetadata(property, typeof(int), typeof(string));

// Assert
Assert.Equal(nameof(string.Length), metadata.Name);
Expand All @@ -322,7 +324,8 @@ public void Names_ReturnExpectedMetadata_ForProperty()
public void GetDisplayName_ReturnsDisplayName_IfSet()
{
// Arrange
var metadata = new TestModelMetadata(typeof(int), "Length", typeof(string));
var property = typeof(string).GetProperty(nameof(string.Length));
var metadata = new TestModelMetadata(property, typeof(int), typeof(string));
metadata.SetDisplayName("displayName");

// Act
Expand Down Expand Up @@ -351,7 +354,8 @@ public void GetDisplayName_ReturnsParameterName_WhenSetAndDisplayNameIsNull()
public void GetDisplayName_ReturnsPropertyName_WhenSetAndDisplayNameIsNull()
{
// Arrange
var metadata = new TestModelMetadata(typeof(int), "Length", typeof(string));
var property = typeof(string).GetProperty(nameof(string.Length));
var metadata = new TestModelMetadata(property, typeof(int), typeof(string));

// Act
var result = metadata.GetDisplayName();
Expand Down Expand Up @@ -419,8 +423,8 @@ public TestModelMetadata(ParameterInfo parameter)
{
}

public TestModelMetadata(Type modelType, string propertyName, Type containerType)
: base(ModelMetadataIdentity.ForProperty(modelType, propertyName, containerType))
public TestModelMetadata(PropertyInfo propertyInfo, Type modelType, Type containerType)
: base(ModelMetadataIdentity.ForProperty(propertyInfo, modelType, containerType))
{
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ private ModelMetadataCacheEntry GetCacheEntry(ParameterInfo parameter, Type mode
private ModelMetadataCacheEntry GetCacheEntry(PropertyInfo property, Type modelType)
{
return _typeCache.GetOrAdd(
ModelMetadataIdentity.ForProperty(modelType, property.Name, property.DeclaringType),
ModelMetadataIdentity.ForProperty(property, modelType, property.DeclaringType),
_cacheEntryFactory);
}

Expand Down Expand Up @@ -275,8 +275,8 @@ protected virtual DefaultMetadataDetails[] CreatePropertyDetails(ModelMetadataId
var propertyHelper = propertyHelpers[i];

var propertyKey = ModelMetadataIdentity.ForProperty(
propertyHelper.Property,
propertyHelper.Property.PropertyType,
propertyHelper.Name,
key.ModelType);

var propertyEntry = CreateSinglePropertyDetails(propertyKey, propertyHelper);
Expand Down
4 changes: 2 additions & 2 deletions src/Mvc/Mvc.Core/test/BindAttributeTest.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.

using System;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.ModelBinding.Metadata;
using Moq;
using Xunit;
Expand All @@ -27,7 +25,9 @@ public void BindAttribute_Include(string property, bool isIncluded)

var context = new DefaultModelBindingContext();

#pragma warning disable CS0618 // Type or member is obsolete
var identity = ModelMetadataIdentity.ForProperty(typeof(int), property, typeof(string));
#pragma warning restore CS0618 // Type or member is obsolete
context.ModelMetadata = new Mock<ModelMetadata>(identity).Object;

// Act
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ public void CreateBindingDetails_FindsBindingBehaviorNever_OnProperty()
};

var context = new BindingMetadataProviderContext(
ModelMetadataIdentity.ForProperty(typeof(int), "Length", typeof(string)),
ModelMetadataIdentity.ForProperty(typeof(string).GetProperty(nameof(string.Length)), typeof(int), typeof(string)),
new ModelAttributes(new object[0], propertyAttributes, null));

var provider = new DefaultBindingMetadataProvider();
Expand All @@ -184,7 +184,7 @@ public void CreateBindingDetails_FindsBindNever_OnProperty()
};

var context = new BindingMetadataProviderContext(
ModelMetadataIdentity.ForProperty(typeof(int), "Length", typeof(string)),
ModelMetadataIdentity.ForProperty(typeof(string).GetProperty(nameof(string.Length)), typeof(int), typeof(string)),
new ModelAttributes(new object[0], propertyAttributes, null));

var provider = new DefaultBindingMetadataProvider();
Expand All @@ -207,7 +207,7 @@ public void CreateBindingDetails_FindsBindingBehaviorOptional_OnProperty()
};

var context = new BindingMetadataProviderContext(
ModelMetadataIdentity.ForProperty(typeof(int), "Length", typeof(string)),
ModelMetadataIdentity.ForProperty(typeof(string).GetProperty(nameof(string.Length)), typeof(int), typeof(string)),
new ModelAttributes(new object[0], propertyAttributes, null));

var provider = new DefaultBindingMetadataProvider();
Expand All @@ -230,7 +230,7 @@ public void CreateBindingDetails_FindsBindingBehaviorRequired_OnProperty()
};

var context = new BindingMetadataProviderContext(
ModelMetadataIdentity.ForProperty(typeof(int), "Length", typeof(string)),
ModelMetadataIdentity.ForProperty(typeof(string).GetProperty(nameof(string.Length)), typeof(int), typeof(string)),
new ModelAttributes(new object[0], propertyAttributes, null));

var provider = new DefaultBindingMetadataProvider();
Expand All @@ -253,7 +253,7 @@ public void CreateBindingDetails_FindsBindRequired_OnProperty()
};

var context = new BindingMetadataProviderContext(
ModelMetadataIdentity.ForProperty(typeof(int), "Length", typeof(string)),
ModelMetadataIdentity.ForProperty(typeof(string).GetProperty(nameof(string.Length)), typeof(int), typeof(string)),
new ModelAttributes(new object[0], propertyAttributes, null));

var provider = new DefaultBindingMetadataProvider();
Expand Down Expand Up @@ -420,7 +420,7 @@ public void CreateBindingDetails_UsesFirstAttribute()
};

var context = new BindingMetadataProviderContext(
ModelMetadataIdentity.ForProperty(typeof(int), "Length", typeof(string)),
ModelMetadataIdentity.ForProperty(typeof(string).GetProperty(nameof(string.Length)), typeof(int), typeof(string)),
new ModelAttributes(new object[0], propertyAttributes, null));

var provider = new DefaultBindingMetadataProvider();
Expand All @@ -438,7 +438,7 @@ public void CreateBindingDetails_FindsBindRequired_OnContainerClass()
{
// Arrange
var context = new BindingMetadataProviderContext(
ModelMetadataIdentity.ForProperty(typeof(string), "Property", typeof(BindRequiredOnClass)),
ModelMetadataIdentity.ForProperty(typeof(BindRequiredOnClass).GetProperty(nameof(BindRequiredOnClass.Property)), typeof(int), typeof(BindRequiredOnClass)),
new ModelAttributes(new object[0], new object[0], null));

var provider = new DefaultBindingMetadataProvider();
Expand All @@ -456,7 +456,7 @@ public void CreateBindingDetails_FindsBindNever_OnContainerClass()
{
// Arrange
var context = new BindingMetadataProviderContext(
ModelMetadataIdentity.ForProperty(typeof(string), "Property", typeof(BindNeverOnClass)),
ModelMetadataIdentity.ForProperty(typeof(BindNeverOnClass).GetProperty(nameof(BindNeverOnClass.Property)), typeof(int), typeof(BindNeverOnClass)),
new ModelAttributes(new object[0], new object[0], null));

var provider = new DefaultBindingMetadataProvider();
Expand All @@ -474,7 +474,7 @@ public void CreateBindingDetails_FindsBindNever_OnBaseClass()
{
// Arrange
var context = new BindingMetadataProviderContext(
ModelMetadataIdentity.ForProperty(typeof(string), "Property", typeof(InheritedBindNeverOnClass)),
ModelMetadataIdentity.ForProperty(typeof(BindNeverOnClass).GetProperty(nameof(BindNeverOnClass.Property)), typeof(int), typeof(BindNeverOnClass)),
new ModelAttributes(new object[0], new object[0], null));

var provider = new DefaultBindingMetadataProvider();
Expand All @@ -497,7 +497,7 @@ public void CreateBindingDetails_OverrideBehaviorOnClass_OverrideWithOptional()
};

var context = new BindingMetadataProviderContext(
ModelMetadataIdentity.ForProperty(typeof(string), "Property", typeof(BindNeverOnClass)),
ModelMetadataIdentity.ForProperty(typeof(BindNeverOnClass).GetProperty(nameof(BindNeverOnClass.Property)), typeof(int), typeof(BindNeverOnClass)),
new ModelAttributes(new object[0], propertyAttributes, null));

var provider = new DefaultBindingMetadataProvider();
Expand All @@ -520,7 +520,7 @@ public void CreateBindingDetails_OverrideBehaviorOnClass_OverrideWithRequired()
};

var context = new BindingMetadataProviderContext(
ModelMetadataIdentity.ForProperty(typeof(string), "Property", typeof(BindNeverOnClass)),
ModelMetadataIdentity.ForProperty(typeof(BindNeverOnClass).GetProperty(nameof(BindNeverOnClass.Property)), typeof(int), typeof(BindNeverOnClass)),
new ModelAttributes(new object[0], propertyAttributes, null));

var provider = new DefaultBindingMetadataProvider();
Expand All @@ -543,7 +543,7 @@ public void CreateBindingDetails_OverrideInheritedBehaviorOnClass_OverrideWithRe
};

var context = new BindingMetadataProviderContext(
ModelMetadataIdentity.ForProperty(typeof(string), "Property", typeof(InheritedBindNeverOnClass)),
ModelMetadataIdentity.ForProperty(typeof(InheritedBindNeverOnClass).GetProperty(nameof(InheritedBindNeverOnClass.Property)), typeof(int), typeof(InheritedBindNeverOnClass)),
new ModelAttributes(new object[0], propertyAttributes, null));

var provider = new DefaultBindingMetadataProvider();
Expand All @@ -566,7 +566,7 @@ public void CreateBindingDetails_OverrideBehaviorOnClass_OverrideWithNever()
};

var context = new BindingMetadataProviderContext(
ModelMetadataIdentity.ForProperty(typeof(string), "Property", typeof(BindRequiredOnClass)),
ModelMetadataIdentity.ForProperty(typeof(BindRequiredOnClass).GetProperty(nameof(BindRequiredOnClass.Property)), typeof(int), typeof(BindRequiredOnClass)),
new ModelAttributes(new object[0], propertyAttributes, null));

var provider = new DefaultBindingMetadataProvider();
Expand All @@ -585,7 +585,7 @@ public void CreateBindingDetails_OverrideBehaviorOnBaseClass_OverrideWithRequire
{
// Arrange
var context = new BindingMetadataProviderContext(
ModelMetadataIdentity.ForProperty(typeof(string), "Property", typeof(BindRequiredOverridesInheritedBindNever)),
ModelMetadataIdentity.ForProperty(typeof(BindRequiredOverridesInheritedBindNever).GetProperty(nameof(BindRequiredOverridesInheritedBindNever.Property)), typeof(int), typeof(BindRequiredOverridesInheritedBindNever)),
new ModelAttributes(new object[0], new object[0], null));

var provider = new DefaultBindingMetadataProvider();
Expand Down Expand Up @@ -641,7 +641,7 @@ public void CreateBindingDetails_BindingBehaviorLeftAlone_ForAttributeOnProperty
};

var context = new BindingMetadataProviderContext(
ModelMetadataIdentity.ForProperty(typeof(int), "Length", typeof(string)),
ModelMetadataIdentity.ForProperty(typeof(string).GetProperty(nameof(string.Length)), typeof(int), typeof(string)),
new ModelAttributes(typeAttributes, new object[0], null));

// These values shouldn't be changed since this is a Type-Metadata
Expand Down
Loading