# （可能也许大概差不离就是）最终版代码（也可能不是）

/// <summary>
/// 判断是否为数值类型。
/// </summary>
/// <param name="t">要判断的类型</param>
/// <returns>是否为数值类型</returns>
public static bool IsNumericType(this Type t)
{
var tc = Type.GetTypeCode(t);
return (t.IsPrimitive && t.IsValueType && !t.IsEnum && tc != TypeCode.Char && tc != TypeCode.Boolean) || tc == TypeCode.Decimal;
}

/// <summary>
/// 判断是否为可空数值类型。
/// </summary>
/// <param name="t">要判断的类型</param>
/// <returns>是否为可空数值类型</returns>
public static bool IsNumericOrNullableNumericType(this Type t)
{
return t.IsNumericType() || (t.IsNullableType() && t.GetGenericArguments()[0].IsNumericType());
}

/// <summary>
/// 判断是否为可空类型。
/// 注意，直接调用可空对象的.GetType()方法返回的会是其泛型值的实际类型，用其进行此判断肯定返回false。
/// </summary>
/// <param name="t">要判断的类型</param>
/// <returns>是否为可空类型</returns>
public static bool IsNullableType(this Type t)
{
return t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>);
}

# 为了累死电脑而设计的测试用代码

[TestClass]
public class BasicTest
{
[TestMethod]
public void 数值类型判断测试()
{
for (int i = 0; i < 500000; i++)
{
Assert.IsTrue((591).GetType().IsNumericType());
Assert.IsTrue((31.131).GetType().IsNumericType());
Assert.IsTrue((31.131f).GetType().IsNumericType());
Assert.IsTrue(((Int64)31).GetType().IsNumericType());
Assert.IsTrue((new decimal(31.351)).GetType().IsNumericType());
Assert.IsTrue((new Decimal(31.351)).GetType().IsNumericType());
Assert.IsTrue(((byte)31).GetType().IsNumericType());
Assert.IsTrue(((UInt64)31).GetType().IsNumericType());
Assert.IsTrue(((UIntPtr)31).GetType().IsNumericType());
Assert.IsTrue(((short)31).GetType().IsNumericType());
Assert.IsTrue(((Single)31).GetType().IsNumericType());

Assert.IsTrue((typeof(Int64?)).IsNumericOrNullableNumericType());
Assert.IsTrue((typeof(UInt64?)).IsNumericOrNullableNumericType());
Assert.IsTrue((typeof(decimal?)).IsNumericOrNullableNumericType());
Assert.IsTrue((typeof(Decimal?)).IsNumericOrNullableNumericType());
Assert.IsTrue((typeof(UIntPtr?)).IsNumericOrNullableNumericType());
Assert.IsTrue((typeof(byte?)).IsNumericOrNullableNumericType());
Assert.IsTrue((typeof(Single?)).IsNumericOrNullableNumericType());
Assert.IsTrue((typeof(Double?)).IsNumericOrNullableNumericType());
Assert.IsTrue((typeof(float?)).IsNumericOrNullableNumericType());
Assert.IsTrue((typeof(double?)).IsNumericOrNullableNumericType());
Assert.IsTrue((typeof(int?)).IsNumericOrNullableNumericType());
Assert.IsTrue((typeof(short?)).IsNumericOrNullableNumericType());
Assert.IsTrue((typeof(Nullable<Byte>)).IsNumericOrNullableNumericType());

Assert.IsFalse(DateTime.Now.GetType().IsNumericType());
Assert.IsFalse(TimeSpan.FromDays(2).GetType().IsNumericType());
Assert.IsFalse("aacc".GetType().IsNumericType());
Assert.IsFalse(System.UriPartial.Path.GetType().IsNumericType());
Assert.IsFalse('c'.GetType().IsNumericType());
Assert.IsFalse(false.GetType().IsNumericType());

Assert.IsFalse((typeof(DateTime?)).IsNumericOrNullableNumericType());
Assert.IsFalse((typeof(Char?)).IsNumericOrNullableNumericType());
Assert.IsFalse((typeof(char?)).IsNumericOrNullableNumericType());
Assert.IsFalse((typeof(System.UriPartial?)).IsNumericOrNullableNumericType());
Assert.IsFalse((typeof(Boolean?)).IsNumericOrNullableNumericType());
Assert.IsFalse((typeof(bool?)).IsNumericOrNullableNumericType());
}

}
}

# 老外！不服跑个分？

JEFFERY YOU 提出应该做一个测试，确实数据最有说服力。

return t == typeof(int)
|| t == typeof(double)
|| t == typeof(long)
|| t == typeof(short)
|| t == typeof(float)
|| t == typeof(Int16)
|| t == typeof(Int32)
|| t == typeof(Int64)
|| t == typeof(uint)
|| t == typeof(UInt16)
|| t == typeof(UInt32)
|| t == typeof(UInt64)
|| t == typeof(sbyte)
|| t == typeof(Single)
|| t == typeof(Decimal)
|| t == typeof(Byte)
|| t == typeof(UIntPtr)
|| t == typeof(IntPtr);

return t == typeof(Int16)
|| t == typeof(Int32)
|| t == typeof(Int64)
|| t == typeof(Single)
|| t == typeof(Double)
|| t == typeof(UInt16)
|| t == typeof(UInt32)
|| t == typeof(UInt64)
|| t == typeof(Byte)
|| t == typeof(Decimal)
|| t == typeof(SByte)
|| t == typeof(UIntPtr)
|| t == typeof(IntPtr);

TypeCode 枚举中是没有  IntPtr 和 UIntPtr 项的，所以还是要做额外判断。

if (t.IsEnum) return false;
var tc = Type.GetTypeCode(t);
switch (tc)
{
case TypeCode.Int16:
case TypeCode.Int32:
case TypeCode.Int64:
case TypeCode.Single:
case TypeCode.Double:
case TypeCode.UInt16:
case TypeCode.UInt32:
case TypeCode.UInt64:
case TypeCode.Byte:
case TypeCode.Decimal:
case TypeCode.SByte:
return true;
default:
return t == typeof(UIntPtr) || t == typeof(IntPtr);
}

# 巡回总结报告会演讲

## （微软：卧槽，看你们这么苦逼，我给你们直接做一个属性出来吧，请期待.Net 框架v10.29博主生日特别无码汉化激情未删减导演剪辑泄露蓝光3D版………嗯，我们将其委托给暴雪工作室开发。）

|
2月前
|
JSON IDE 前端开发
[.NET开发者的福音]一个方便易用的在线.NET代码编辑工具.NET Fiddle
[.NET开发者的福音]一个方便易用的在线.NET代码编辑工具.NET Fiddle
52 0
|
8月前
|

38 0
|
7天前
|

.NET Core 和 .NET 标准类库项目类型有什么区别？

14 0
|
1月前
|
XML 开发框架 .NET
【.NET Core】常见C#代码约定
【.NET Core】常见C#代码约定
23 5
|
1月前
|

ASP.NET Core Web中使用AutoMapper进行对象映射
ASP.NET Core Web中使用AutoMapper进行对象映射
25 1
|
2月前
|

C#.Net筑基-类型系统②常见类型--枚举Enum

40 7
|
2月前
|

C#.Net筑基-类型系统②常见类型 --record是什么类型？
record在C#中是一种创建简单、只读数据结构的方式，常用于轻量级数据传输。它本质上是类（默认）或结构体的快捷形式，包含自动生成的属性、Equals、ToString、解构赋值等方法。记录类型可以继承其他record或接口，但不继承普通类。支持使用with语句创建副本。例如，public record User(string Name, int Age)会被编译为包含属性、相等比较和ToString()等方法的类。记录类型提供了解构赋值和自定义实现，如密封的sealed记录，防止子类重写。
33 6
|
2月前
|

C#.Net筑基-类型系统②常见类型--结构体类型Struct

35 6
|
2月前
|

C#.Net筑基-类型系统②常见类型--日期和时间的故事

33 5
|
1月前
|

【.NET Core】可为null类型详解
【.NET Core】可为null类型详解
94 0