Fix to special case Dispose method to be treated as non-action
This commit is contained in:
parent
e9d8c845d6
commit
4598505652
|
|
@ -1,6 +1,7 @@
|
||||||
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
|
// 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.
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
|
@ -16,9 +17,9 @@ namespace Microsoft.AspNet.Mvc.ApplicationModels
|
||||||
public class DefaultActionModelBuilder : IActionModelBuilder
|
public class DefaultActionModelBuilder : IActionModelBuilder
|
||||||
{
|
{
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public IEnumerable<ActionModel> BuildActionModels([NotNull] MethodInfo methodInfo)
|
public IEnumerable<ActionModel> BuildActionModels([NotNull] TypeInfo typeInfo, [NotNull] MethodInfo methodInfo)
|
||||||
{
|
{
|
||||||
if (!IsAction(methodInfo))
|
if (!IsAction(typeInfo, methodInfo))
|
||||||
{
|
{
|
||||||
return Enumerable.Empty<ActionModel>();
|
return Enumerable.Empty<ActionModel>();
|
||||||
}
|
}
|
||||||
|
|
@ -131,29 +132,70 @@ namespace Microsoft.AspNet.Mvc.ApplicationModels
|
||||||
/// Returns <c>true</c> if the <paramref name="methodInfo"/> is an action. Otherwise <c>false</c>.
|
/// Returns <c>true</c> if the <paramref name="methodInfo"/> is an action. Otherwise <c>false</c>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="methodInfo">The <see cref="MethodInfo"/>.</param>
|
/// <param name="methodInfo">The <see cref="MethodInfo"/>.</param>
|
||||||
|
/// <param name="typeInfo">The <see cref="TypeInfo"/>.</param>
|
||||||
/// <returns><c>true</c> if the <paramref name="methodInfo"/> is an action. Otherwise <c>false</c>.</returns>
|
/// <returns><c>true</c> if the <paramref name="methodInfo"/> is an action. Otherwise <c>false</c>.</returns>
|
||||||
/// <remarks>
|
/// <remarks>
|
||||||
/// Override this method to provide custom logic to determine which methods are considered actions.
|
/// Override this method to provide custom logic to determine which methods are considered actions.
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
protected virtual bool IsAction([NotNull] MethodInfo methodInfo)
|
protected virtual bool IsAction([NotNull] TypeInfo typeInfo, [NotNull] MethodInfo methodInfo)
|
||||||
{
|
{
|
||||||
|
// The SpecialName bit is set to flag members that are treated in a special way by some compilers
|
||||||
|
// (such as property accessors and operator overloading methods).
|
||||||
|
if (methodInfo.IsSpecialName)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (methodInfo.IsDefined(typeof(NonActionAttribute)))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Overriden methods from Object class, e.g. Equals(Object), GetHashCode(), etc., are not valid.
|
||||||
|
if (methodInfo.GetBaseDefinition().DeclaringType == typeof(object))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Dispose method implemented from IDisposable is not valid
|
||||||
|
if (IsIDisposableMethod(methodInfo, typeInfo))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (methodInfo.IsStatic)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (methodInfo.IsAbstract)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (methodInfo.IsConstructor)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (methodInfo.IsGenericMethod)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
methodInfo.IsPublic &&
|
methodInfo.IsPublic;
|
||||||
!methodInfo.IsStatic &&
|
|
||||||
!methodInfo.IsAbstract &&
|
|
||||||
!methodInfo.IsConstructor &&
|
|
||||||
!methodInfo.IsGenericMethod &&
|
|
||||||
|
|
||||||
// The SpecialName bit is set to flag members that are treated in a special way by some compilers
|
|
||||||
// (such as property accessors and operator overloading methods).
|
|
||||||
!methodInfo.IsSpecialName &&
|
|
||||||
!methodInfo.IsDefined(typeof(NonActionAttribute)) &&
|
|
||||||
|
|
||||||
// Overriden methods from Object class, e.g. Equals(Object), GetHashCode(), etc., are not valid.
|
|
||||||
methodInfo.GetBaseDefinition().DeclaringType != typeof(object);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
private bool IsIDisposableMethod(MethodInfo methodInfo, TypeInfo typeInfo)
|
||||||
|
{
|
||||||
|
return
|
||||||
|
(typeof(IDisposable).GetTypeInfo().IsAssignableFrom(typeInfo) &&
|
||||||
|
typeInfo.GetRuntimeInterfaceMap(typeof(IDisposable)).TargetMethods[0] == methodInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <suethodandlemary>
|
||||||
/// Creates an <see cref="ActionModel"/> for the given <see cref="MethodInfo"/>.
|
/// Creates an <see cref="ActionModel"/> for the given <see cref="MethodInfo"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="methodInfo">The <see cref="MethodInfo"/>.</param>
|
/// <param name="methodInfo">The <see cref="MethodInfo"/>.</param>
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,7 @@ namespace Microsoft.AspNet.Mvc.ApplicationModels
|
||||||
|
|
||||||
foreach (var methodInfo in typeInfo.AsType().GetMethods())
|
foreach (var methodInfo in typeInfo.AsType().GetMethods())
|
||||||
{
|
{
|
||||||
var actionModels = _actionModelBuilder.BuildActionModels(methodInfo);
|
var actionModels = _actionModelBuilder.BuildActionModels(typeInfo, methodInfo);
|
||||||
if (actionModels != null)
|
if (actionModels != null)
|
||||||
{
|
{
|
||||||
foreach (var actionModel in actionModels)
|
foreach (var actionModel in actionModels)
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
|
// 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.
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
|
||||||
|
|
@ -16,11 +17,12 @@ namespace Microsoft.AspNet.Mvc.ApplicationModels
|
||||||
/// <paramref name="methodInfo"/> is not an action method.
|
/// <paramref name="methodInfo"/> is not an action method.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="methodInfo">The <see cref="MethodInfo"/>.</param>
|
/// <param name="methodInfo">The <see cref="MethodInfo"/>.</param>
|
||||||
|
/// <param name="typeInfo">The <see cref="TypeInfo"/>.</param>
|
||||||
/// <returns>A set of <see cref="ActionModel"/> or null.</returns>
|
/// <returns>A set of <see cref="ActionModel"/> or null.</returns>
|
||||||
/// <remarks>
|
/// <remarks>
|
||||||
/// Instances of <see cref="ActionModel"/> returned from this interface should have their
|
/// Instances of <see cref="ActionModel"/> returned from this interface should have their
|
||||||
/// <see cref="ActionModel.Parameters"/> initialized.
|
/// <see cref="ActionModel.Parameters"/> initialized.
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
IEnumerable<ActionModel> BuildActionModels([NotNull] MethodInfo methodInfo);
|
IEnumerable<ActionModel> BuildActionModels([NotNull] TypeInfo typeInfo, [NotNull] MethodInfo methodInfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -720,7 +720,6 @@ namespace Microsoft.AspNet.Mvc
|
||||||
bindingContext.ValidatorProvider);
|
bindingContext.ValidatorProvider);
|
||||||
}
|
}
|
||||||
|
|
||||||
[NonAction]
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
Dispose(disposing: true);
|
Dispose(disposing: true);
|
||||||
|
|
|
||||||
|
|
@ -372,7 +372,6 @@ namespace System.Web.Http
|
||||||
return new HttpStatusCodeResult((int)status);
|
return new HttpStatusCodeResult((int)status);
|
||||||
}
|
}
|
||||||
|
|
||||||
[NonAction]
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
Dispose(true);
|
Dispose(true);
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ namespace Microsoft.AspNet.Mvc.ApplicationModels
|
||||||
Assert.NotNull(method);
|
Assert.NotNull(method);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var isValid = builder.IsAction(method);
|
var isValid = builder.IsAction(typeof(DerivedController).GetTypeInfo(), method);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
Assert.Equal(expected, isValid);
|
Assert.Equal(expected, isValid);
|
||||||
|
|
@ -38,7 +38,7 @@ namespace Microsoft.AspNet.Mvc.ApplicationModels
|
||||||
Assert.NotNull(method);
|
Assert.NotNull(method);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var isValid = builder.IsAction(method);
|
var isValid = builder.IsAction(typeof(BaseController).GetTypeInfo(), method);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
Assert.False(isValid);
|
Assert.False(isValid);
|
||||||
|
|
@ -55,7 +55,7 @@ namespace Microsoft.AspNet.Mvc.ApplicationModels
|
||||||
Assert.NotNull(method);
|
Assert.NotNull(method);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var isValid = builder.IsAction(method);
|
var isValid = builder.IsAction(typeof(DerivedController).GetTypeInfo(), method);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
Assert.False(isValid);
|
Assert.False(isValid);
|
||||||
|
|
@ -71,7 +71,7 @@ namespace Microsoft.AspNet.Mvc.ApplicationModels
|
||||||
Assert.True(method.IsSpecialName);
|
Assert.True(method.IsSpecialName);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var isValid = builder.IsAction(method);
|
var isValid = builder.IsAction(typeof(OperatorOverloadingController).GetTypeInfo(), method);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
Assert.False(isValid);
|
Assert.False(isValid);
|
||||||
|
|
@ -86,7 +86,7 @@ namespace Microsoft.AspNet.Mvc.ApplicationModels
|
||||||
Assert.NotNull(method);
|
Assert.NotNull(method);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var isValid = builder.IsAction(method);
|
var isValid = builder.IsAction(typeof(DerivedController).GetTypeInfo(), method);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
Assert.False(isValid);
|
Assert.False(isValid);
|
||||||
|
|
@ -101,7 +101,7 @@ namespace Microsoft.AspNet.Mvc.ApplicationModels
|
||||||
Assert.NotNull(method);
|
Assert.NotNull(method);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var isValid = builder.IsAction(method);
|
var isValid = builder.IsAction(typeof(DerivedController).GetTypeInfo(), method);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
Assert.False(isValid);
|
Assert.False(isValid);
|
||||||
|
|
@ -122,12 +122,144 @@ namespace Microsoft.AspNet.Mvc.ApplicationModels
|
||||||
Assert.NotNull(method);
|
Assert.NotNull(method);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var isValid = builder.IsAction(method);
|
var isValid = builder.IsAction(typeof(DerivedController).GetTypeInfo(), method);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
Assert.False(isValid);
|
Assert.False(isValid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void IsAction_DerivedControllerIDisposableDisposeMethod()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var builder = new AccessibleActionModelBuilder();
|
||||||
|
var typeInfo = typeof(DerivedController).GetTypeInfo();
|
||||||
|
var methodInfo =
|
||||||
|
typeInfo.GetRuntimeInterfaceMap(typeof(IDisposable)).TargetMethods[0];
|
||||||
|
var method = typeInfo.GetMethods().Where(m => (m == methodInfo)).SingleOrDefault();
|
||||||
|
Assert.NotNull(method);
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var isValid = builder.IsAction(typeInfo, method);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.False(isValid);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void IsAction_DerivedControllerDisposeMethod()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var builder = new AccessibleActionModelBuilder();
|
||||||
|
var typeInfo = typeof(DerivedController).GetTypeInfo();
|
||||||
|
var methodInfo =
|
||||||
|
typeInfo.GetRuntimeInterfaceMap(typeof(IDisposable)).TargetMethods[0];
|
||||||
|
var methods = typeInfo.GetMethods().Where(m => m.Name.Equals("Dispose") && m != methodInfo);
|
||||||
|
|
||||||
|
Assert.NotEmpty(methods);
|
||||||
|
|
||||||
|
foreach (var method in methods)
|
||||||
|
{
|
||||||
|
// Act
|
||||||
|
var isValid = builder.IsAction(typeInfo, method);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.True(isValid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void IsAction_OverriddenDisposeMethod()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var builder = new AccessibleActionModelBuilder();
|
||||||
|
var typeInfo = typeof(DerivedOverriddenDisposeController).GetTypeInfo();
|
||||||
|
var method = typeInfo.GetDeclaredMethods("Dispose").SingleOrDefault();
|
||||||
|
Assert.NotNull(method);
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var isValid = builder.IsAction(typeInfo, method);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.False(isValid);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void IsAction_NewDisposeMethod()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var builder = new AccessibleActionModelBuilder();
|
||||||
|
var typeInfo = typeof(DerivedNewDisposeController).GetTypeInfo();
|
||||||
|
var method = typeInfo.GetDeclaredMethods("Dispose").SingleOrDefault();
|
||||||
|
Assert.NotNull(method);
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var isValid = builder.IsAction(typeInfo, method);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.True(isValid);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void IsAction_PocoControllerIDisposableDisposeMethod()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var builder = new AccessibleActionModelBuilder();
|
||||||
|
var typeInfo = typeof(IDisposablePocoController).GetTypeInfo();
|
||||||
|
var methodInfo =
|
||||||
|
typeInfo.GetRuntimeInterfaceMap(typeof(IDisposable)).TargetMethods[0];
|
||||||
|
var method = typeInfo.GetMethods().Where(m => (m == methodInfo)).SingleOrDefault();
|
||||||
|
Assert.NotNull(method);
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var isValid = builder.IsAction(typeInfo, method);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.False(isValid);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void IsAction_PocoControllerDisposeMethod()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var builder = new AccessibleActionModelBuilder();
|
||||||
|
var typeInfo = typeof(IDisposablePocoController).GetTypeInfo();
|
||||||
|
var methodInfo =
|
||||||
|
typeInfo.GetRuntimeInterfaceMap(typeof(IDisposable)).TargetMethods[0];
|
||||||
|
var methods = typeInfo.GetMethods().Where(m => m.Name.Equals("Dispose") && m != methodInfo);
|
||||||
|
|
||||||
|
Assert.NotEmpty(methods);
|
||||||
|
|
||||||
|
foreach (var method in methods)
|
||||||
|
{
|
||||||
|
// Act
|
||||||
|
var isValid = builder.IsAction(typeInfo, method);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.True(isValid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void IsAction_SimplePocoControllerDisposeMethod()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var builder = new AccessibleActionModelBuilder();
|
||||||
|
var typeInfo = typeof(SimplePocoController).GetTypeInfo();
|
||||||
|
var methods = typeInfo.GetMethods().Where(m => m.Name.Equals("Dispose"));
|
||||||
|
|
||||||
|
Assert.NotEmpty(methods);
|
||||||
|
|
||||||
|
foreach (var method in methods)
|
||||||
|
{
|
||||||
|
// Act
|
||||||
|
var isValid = builder.IsAction(typeInfo, method);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.True(isValid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
[Theory]
|
[Theory]
|
||||||
[InlineData("StaticMethod")]
|
[InlineData("StaticMethod")]
|
||||||
[InlineData("ProtectedStaticMethod")]
|
[InlineData("ProtectedStaticMethod")]
|
||||||
|
|
@ -142,7 +274,7 @@ namespace Microsoft.AspNet.Mvc.ApplicationModels
|
||||||
Assert.NotNull(method);
|
Assert.NotNull(method);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var isValid = builder.IsAction(method);
|
var isValid = builder.IsAction(typeof(DerivedController).GetTypeInfo(), method);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
Assert.False(isValid);
|
Assert.False(isValid);
|
||||||
|
|
@ -157,7 +289,7 @@ namespace Microsoft.AspNet.Mvc.ApplicationModels
|
||||||
var actionName = nameof(ConventionallyRoutedController.Edit);
|
var actionName = nameof(ConventionallyRoutedController.Edit);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var actions = builder.BuildActionModels(typeInfo.GetMethod(actionName));
|
var actions = builder.BuildActionModels(typeInfo, typeInfo.GetMethod(actionName));
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
var action = Assert.Single(actions);
|
var action = Assert.Single(actions);
|
||||||
|
|
@ -177,7 +309,7 @@ namespace Microsoft.AspNet.Mvc.ApplicationModels
|
||||||
var actionName = nameof(ConventionallyRoutedController.Update);
|
var actionName = nameof(ConventionallyRoutedController.Update);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var actions = builder.BuildActionModels(typeInfo.GetMethod(actionName));
|
var actions = builder.BuildActionModels(typeInfo, typeInfo.GetMethod(actionName));
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
var action = Assert.Single(actions);
|
var action = Assert.Single(actions);
|
||||||
|
|
@ -199,7 +331,7 @@ namespace Microsoft.AspNet.Mvc.ApplicationModels
|
||||||
var actionName = nameof(ConventionallyRoutedController.Delete);
|
var actionName = nameof(ConventionallyRoutedController.Delete);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var actions = builder.BuildActionModels(typeInfo.GetMethod(actionName));
|
var actions = builder.BuildActionModels(typeInfo, typeInfo.GetMethod(actionName));
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
var action = Assert.Single(actions);
|
var action = Assert.Single(actions);
|
||||||
|
|
@ -222,7 +354,7 @@ namespace Microsoft.AspNet.Mvc.ApplicationModels
|
||||||
var actionName = nameof(ConventionallyRoutedController.Details);
|
var actionName = nameof(ConventionallyRoutedController.Details);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var actions = builder.BuildActionModels(typeInfo.GetMethod(actionName));
|
var actions = builder.BuildActionModels(typeInfo, typeInfo.GetMethod(actionName));
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
var action = Assert.Single(actions);
|
var action = Assert.Single(actions);
|
||||||
|
|
@ -242,7 +374,7 @@ namespace Microsoft.AspNet.Mvc.ApplicationModels
|
||||||
var actionName = nameof(ConventionallyRoutedController.List);
|
var actionName = nameof(ConventionallyRoutedController.List);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var actions = builder.BuildActionModels(typeInfo.GetMethod(actionName));
|
var actions = builder.BuildActionModels(typeInfo, typeInfo.GetMethod(actionName));
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
var action = Assert.Single(actions);
|
var action = Assert.Single(actions);
|
||||||
|
|
@ -263,7 +395,7 @@ namespace Microsoft.AspNet.Mvc.ApplicationModels
|
||||||
var actionName = nameof(NoRouteAttributeOnControllerController.Edit);
|
var actionName = nameof(NoRouteAttributeOnControllerController.Edit);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var actions = builder.BuildActionModels(typeInfo.GetMethod(actionName));
|
var actions = builder.BuildActionModels(typeInfo, typeInfo.GetMethod(actionName));
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
var action = Assert.Single(actions);
|
var action = Assert.Single(actions);
|
||||||
|
|
@ -289,7 +421,7 @@ namespace Microsoft.AspNet.Mvc.ApplicationModels
|
||||||
var actionName = nameof(NoRouteAttributeOnControllerController.Update);
|
var actionName = nameof(NoRouteAttributeOnControllerController.Update);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var actions = builder.BuildActionModels(typeInfo.GetMethod(actionName));
|
var actions = builder.BuildActionModels(typeInfo, typeInfo.GetMethod(actionName));
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
var action = Assert.Single(actions);
|
var action = Assert.Single(actions);
|
||||||
|
|
@ -314,7 +446,7 @@ namespace Microsoft.AspNet.Mvc.ApplicationModels
|
||||||
var actionName = nameof(NoRouteAttributeOnControllerController.List);
|
var actionName = nameof(NoRouteAttributeOnControllerController.List);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var actions = builder.BuildActionModels(typeInfo.GetMethod(actionName));
|
var actions = builder.BuildActionModels(typeInfo, typeInfo.GetMethod(actionName));
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
var action = Assert.Single(actions);
|
var action = Assert.Single(actions);
|
||||||
|
|
@ -339,7 +471,7 @@ namespace Microsoft.AspNet.Mvc.ApplicationModels
|
||||||
var actionName = nameof(NoRouteAttributeOnControllerController.Index);
|
var actionName = nameof(NoRouteAttributeOnControllerController.Index);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var actions = builder.BuildActionModels(typeInfo.GetMethod(actionName));
|
var actions = builder.BuildActionModels(typeInfo, typeInfo.GetMethod(actionName));
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
Assert.Equal(2, actions.Count());
|
Assert.Equal(2, actions.Count());
|
||||||
|
|
@ -372,7 +504,7 @@ namespace Microsoft.AspNet.Mvc.ApplicationModels
|
||||||
var actionName = nameof(NoRouteAttributeOnControllerController.Remove);
|
var actionName = nameof(NoRouteAttributeOnControllerController.Remove);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var actions = builder.BuildActionModels(typeInfo.GetMethod(actionName));
|
var actions = builder.BuildActionModels(typeInfo, typeInfo.GetMethod(actionName));
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
var action = Assert.Single(actions);
|
var action = Assert.Single(actions);
|
||||||
|
|
@ -397,7 +529,7 @@ namespace Microsoft.AspNet.Mvc.ApplicationModels
|
||||||
var typeInfo = controller.GetTypeInfo();
|
var typeInfo = controller.GetTypeInfo();
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var actions = builder.BuildActionModels(typeInfo.GetMethod("Delete"));
|
var actions = builder.BuildActionModels(typeInfo, typeInfo.GetMethod("Delete"));
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
var action = Assert.Single(actions);
|
var action = Assert.Single(actions);
|
||||||
|
|
@ -422,7 +554,7 @@ namespace Microsoft.AspNet.Mvc.ApplicationModels
|
||||||
var typeInfo = controller.GetTypeInfo();
|
var typeInfo = controller.GetTypeInfo();
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var actions = builder.BuildActionModels(typeInfo.GetMethod("Index"));
|
var actions = builder.BuildActionModels(typeInfo, typeInfo.GetMethod("Index"));
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
Assert.Equal(2, actions.Count());
|
Assert.Equal(2, actions.Count());
|
||||||
|
|
@ -446,9 +578,9 @@ namespace Microsoft.AspNet.Mvc.ApplicationModels
|
||||||
|
|
||||||
private class AccessibleActionModelBuilder : DefaultActionModelBuilder
|
private class AccessibleActionModelBuilder : DefaultActionModelBuilder
|
||||||
{
|
{
|
||||||
public new bool IsAction([NotNull]MethodInfo methodInfo)
|
public new bool IsAction([NotNull] TypeInfo typeInfo, [NotNull]MethodInfo methodInfo)
|
||||||
{
|
{
|
||||||
return base.IsAction(methodInfo);
|
return base.IsAction(typeInfo, methodInfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -508,6 +640,80 @@ namespace Microsoft.AspNet.Mvc.ApplicationModels
|
||||||
private static void PrivateStaticMethod()
|
private static void PrivateStaticMethod()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public string Dispose(string s)
|
||||||
|
{
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
public new void Dispose()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private class IDisposablePocoController : IDisposable
|
||||||
|
{
|
||||||
|
public string Index()
|
||||||
|
{
|
||||||
|
return "Hello world";
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
Dispose(disposing: true);
|
||||||
|
GC.SuppressFinalize(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual void Dispose(bool disposing)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
public string Dispose(string s)
|
||||||
|
{
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private class BaseClass : IDisposable
|
||||||
|
{
|
||||||
|
public virtual void Dispose()
|
||||||
|
{
|
||||||
|
Dispose(disposing: true);
|
||||||
|
GC.SuppressFinalize(this);
|
||||||
|
}
|
||||||
|
protected virtual void Dispose(bool disposing)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private class DerivedOverriddenDisposeController : BaseClass
|
||||||
|
{
|
||||||
|
public override void Dispose()
|
||||||
|
{
|
||||||
|
base.Dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private class DerivedNewDisposeController : BaseClass
|
||||||
|
{
|
||||||
|
public new void Dispose()
|
||||||
|
{
|
||||||
|
base.Dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private class SimplePocoController
|
||||||
|
{
|
||||||
|
public string Index()
|
||||||
|
{
|
||||||
|
return "Hello world";
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose(string s)
|
||||||
|
{
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class OperatorOverloadingController : Mvc.Controller
|
private class OperatorOverloadingController : Mvc.Controller
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,9 @@ namespace Microsoft.AspNet.Mvc.Test
|
||||||
{
|
{
|
||||||
return typeof(Controller).GetTypeInfo()
|
return typeof(Controller).GetTypeInfo()
|
||||||
.DeclaredMethods
|
.DeclaredMethods
|
||||||
.Where(method => method.IsPublic && !method.IsSpecialName)
|
.Where(method => method.IsPublic &&
|
||||||
|
!method.IsSpecialName &&
|
||||||
|
!method.Name.Equals("Dispose", StringComparison.OrdinalIgnoreCase))
|
||||||
.Select(method => new[] { method });
|
.Select(method => new[] { method });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue