Skip to content

Commit 3528d68

Browse files
Lieroajcvickers
authored andcommitted
Adding support for custom ValidationResult (derived class) in CustomValidationAttribute
Commit migrated from dotnet/corefx@27af01c
1 parent ff644f2 commit 3528d68

File tree

2 files changed

+26
-2
lines changed

2 files changed

+26
-2
lines changed

src/libraries/System.ComponentModel.Annotations/src/System/ComponentModel/DataAnnotations/CustomValidationAttribute.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -242,8 +242,8 @@ private string ValidateMethodParameter()
242242
return SR.Format(SR.CustomValidationAttribute_Method_Not_Found, Method, ValidatorType.Name);
243243
}
244244

245-
// Method must return a ValidationResult
246-
if (methodInfo.ReturnType != typeof(ValidationResult))
245+
// Method must return a ValidationResult or derived class
246+
if (!typeof(ValidationResult).IsAssignableFrom(methodInfo.ReturnType))
247247
{
248248
return SR.Format(SR.CustomValidationAttribute_Method_Must_Return_ValidationResult, Method, ValidatorType.Name);
249249
}

src/libraries/System.ComponentModel.Annotations/tests/System/ComponentModel/DataAnnotations/CustomValidationAttributeTests.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ protected override IEnumerable<TestCase> InvalidValues()
6363

6464
[Theory]
6565
[InlineData(typeof(CustomValidator), "SomeMethod")]
66+
[InlineData(typeof(CustomValidator), nameof(CustomValidator.ValidationMethodDerivedReturnTypeReturnsSomeError))]
6667
[InlineData(null, null)]
6768
[InlineData(typeof(string), "")]
6869
[InlineData(typeof(int), " \t\r\n")]
@@ -178,6 +179,14 @@ public static void Validate_MethodThrowsCustomException_IsNotCaught()
178179
AssertExtensions.Throws<ArgumentException>(null, () => attribute.Validate(new IConvertibleImplementor(), s_testValidationContext));
179180
}
180181

182+
[Fact]
183+
public static void GetValidationResult_MethodReturnDerivedValidationResult_ReturnsExpected()
184+
{
185+
CustomValidationAttribute attribute = GetAttribute(nameof(CustomValidator.ValidationMethodDerivedReturnTypeReturnsSomeError));
186+
ValidationResult validationResult = attribute.GetValidationResult(new object(), s_testValidationContext);
187+
Assert.Equal(DerivedValidationResult.SomeError, validationResult);
188+
}
189+
181190
internal class NonPublicCustomValidator
182191
{
183192
public static ValidationResult ValidationMethodOneArg(object o) => ValidationResult.Success;
@@ -210,6 +219,9 @@ public static ValidationResult ValidationMethodThreeArgs(object o, ValidationCon
210219
return ValidationResult.Success;
211220
}
212221

222+
public static DerivedValidationResult ValidationMethodDerivedReturnTypeReturnsSomeError(object o) =>
223+
DerivedValidationResult.SomeError;
224+
213225
public static ValidationResult CorrectValidationMethodOneArg(object o)
214226
{
215227
if (o is string) { return ValidationResult.Success; }
@@ -272,5 +284,17 @@ public struct TestStruct
272284
}
273285

274286
public struct GenericStruct<T> { }
287+
288+
public class DerivedValidationResult : ValidationResult
289+
{
290+
public DerivedValidationResult(string errorMessage): base(errorMessage)
291+
{
292+
}
293+
294+
public static readonly DerivedValidationResult SomeError =
295+
new DerivedValidationResult("Some Error") { AdditionalData = "Additional Data" };
296+
297+
public string AdditionalData { get; set; }
298+
}
275299
}
276300
}

0 commit comments

Comments
 (0)