-
Notifications
You must be signed in to change notification settings - Fork 21
Expand file tree
/
Copy pathTypeExtensions.cs
More file actions
66 lines (56 loc) · 1.83 KB
/
TypeExtensions.cs
File metadata and controls
66 lines (56 loc) · 1.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
namespace SharpGrip.FluentValidation.AutoValidation.Shared.Extensions
{
public static class TypeExtensions
{
private static readonly HashSet<Type> builtInTypes =
[
typeof(string),
typeof(decimal),
typeof(DateTime),
typeof(DateTimeOffset),
typeof(TimeSpan),
typeof(DateOnly),
typeof(TimeOnly),
typeof(Uri),
typeof(Guid),
typeof(Enum)
];
public static bool IsCustomType(this Type? type)
{
if (type == null || type.IsEnum || type.IsPrimitive)
{
return false;
}
if (builtInTypes.Contains(type))
{
return false;
}
if (typeof(IEnumerable).IsAssignableFrom(type))
{
var underlyingType = type.IsArray ? type.GetElementType() : type.GetGenericArguments().LastOrDefault();
return underlyingType != null && underlyingType.IsCustomType();
}
return type.IsClass || type.IsValueType;
}
public static bool HasCustomAttribute<TAttribute>(this Type type) where TAttribute : Attribute
{
return type.CustomAttributes.Any(attribute => attribute.AttributeType == typeof(TAttribute));
}
public static bool InheritsFromTypeWithNameEndingIn(this Type type, string name)
{
while (type.BaseType != null)
{
type = type.BaseType;
if (type.Name.EndsWith(name, StringComparison.OrdinalIgnoreCase))
{
return true;
}
}
return false;
}
}
}