JHelpers 6 - 一个优秀而忠诚的仆人





4.00/5 (7投票s)
一个包含通用有用方法和功能的库,可以节省开发人员编写代码来完成这些平凡任务的时间。目标平台为 .NET 6。
引言
JHelpers6
是一个 .NET 6 库组件,可用于任何 .NET 6 兼容项目以及任何受支持的操作系统。它是一个包含通用有用方法和功能的库,可以节省开发人员编写代码来完成这些平凡任务的时间——或者更糟的是,避免在多个地方编写同一个功能的多个版本。JHelpers6
就出于这个原因被用在了我的 JDAC6 和 JLogger6
NuGet 包中。
- 源代码位于 https://github.com/MSBassSinger/JHelpers6
- 演示代码位于 https://github.com/MSBassSinger/JHelpers_Demo6
要了解使用 JHelpers6
库的最佳示例,请参阅上面引用的演示代码。对于初次阅读者,我包含了该演示项目中的代码片段,以提供一个关于如何以及为何使用该库各种属性的小窥视。
该组件可以通过在 NuGet 上搜索 Jeff.Jones.JHelpers6
来找到,或者直接访问 https://nuget.net.cn/packages/Jeff.Jones.JHelpers6/。
背景
随着时间的推移,和我许多开发人员一样,我发现有某些辅助函数和简单功能是我在多个项目中使用的。因此,我将它们(从头重写,以免使用为他人编写并归他人所有的代码)集成到一个库中。然后我“吃了自己的狗粮”(可以说),将这个库用在了另外两个 NuGet 项目中。
CommonHelpers
是一个 static
类,其中包含 static
方法和扩展。
ContextMgr
是一个线程安全的单例,可用于在应用程序中的任何位置、任何线程都可以访问的单个位置存储数据。一个典型的用途是存储设置和其他运行时值,以便只需读取其源(文件、数据库等)一次。任何可以定义为唯一的 String
名称和任何类型的值或引用类型都可以存储在那里,值以 String
键名(必须是唯一的)和任何值或引用类型(装箱为动态类型)的形式添加。
ContextMgr
没有初始化,并且作为单例,它不使用“new
”来创建。实际实例是在代码中第一次引用时动态创建的。
Using the Code
ContextMgr 代码示例
在此示例中,一些名称-值对被添加到 ContextMgr
单例中。它们可以从项目中的任何其他代码访问。这为您提供了一个地方,可以在代码中的一个位置(例如启动时读取的值)存储、编辑和检索值。
请注意,TryGetValue
方法提供了一种优雅的方式来获取值并确定该值是否存在。
Boolean retVal = false;
ContextMgr.Instance.ContextValues.Add("Computer Name", Environment.MachineName);
ContextMgr.Instance.ContextValues.Add("Startup Time", DateTime.Now);
IPAddress[] ips = Dns.GetHostAddresses("BubbaComputer");
ContextMgr.Instance.ContextValues.Add("IP Addresses", ips);
dynamic machineName = "";
retVal = ContextMgr.Instance.ContextValues.TryGetValue("Computer Name", out machineName);
dynamic startupTime = "";
retVal = ContextMgr.Instance.ContextValues.TryGetValue("Startup Time", out startupTime);
dynamic hostAddresses = null;
retVal = ContextMgr.Instance.ContextValues.TryGetValue("IP Addresses", out hostAddresses);
// In your application’s shutdown code, I recommend adding this line so the
// ContextMgr disposes of its resources without waiting on the .NET garbage collector.
ContextMgr.Instance.Dispose();
CommonHelpers API
这是一个 static
类,包含许多有用的 static
方法。一旦引用了命名空间,扩展方法就会在 Intellisense 中显示。
扩展方法
String GetFullExceptionMessage(this Exception ex2Examine,
Boolean getDataCollection,
Boolean getStackTrace)
示例
String result = exUnhandled.GetFullExceptionMessage(true, true);
txtResults.Text += $"Exception Message with data collection and stack trace:
{Environment.NewLine}{result}{Environment.NewLine}" + Environment.NewLine;
result = exUnhandled.GetFullExceptionMessage(true, false);
txtResults.Text += $"Exception Message with data collection and no stack trace:
{Environment.NewLine}{result}{Environment.NewLine}" + Environment.NewLine;
result = exUnhandled.GetFullExceptionMessage(false, true);
txtResults.Text += $"Exception Message with no data collection and with stack trace:
{Environment.NewLine}{result}{Environment.NewLine}" + Environment.NewLine;
result = exUnhandled.GetFullExceptionMessage(false, false);
txtResults.Text += $"Exception Message with no data collection and no stack trace:
{Environment.NewLine}{result}{Environment.NewLine}" + Environment.NewLine;
这个 Exception
对象扩展返回父异常和堆栈中任何异常的错误消息,以及可选的数据集合。Exception.Data
集合用于存储名称-值对,这些对通常用于记录运行时值或其他重要数据以供调试。
Boolean Contains(this String source, String toCheck, StringComparison strComp)
示例
Gives the Contains method a way to do ignore or use case
String origString = "This is the original string.";
Boolean result1 = origString.Contains
("Original", StringComparison.CurrentCulture); // result1 = false
Boolean result2 = origString.Contains("Original",
StringComparison.CurrentCultureIgnoreCase); // result2 = true
这个 String
对象扩展允许对 string
进行比较类型操作,以进行检查。如果 toCheck string
存在于源 string
中,则扩展方法返回 true
,否则返回 false
。
Int32 ContainsHowMany(this String source, String toCheck, Boolean ignoreCase = false)
示例
String origString = "Having tea with the Team.";
Int32 result1 = origString.ContainsHowMany("tea", true); // result1 = 2
Int32 result2 = origString.ContainsHowMany("tea"); // result2 = 1
这个 String
对象扩展用于计算给定 string
在另一个 string
中出现的次数。扩展方法返回 0
到 n
次出现次数的 Count
。
Boolean ConvertToBoolean(this String valueToExamine, out Boolean isBoolean)
示例
String origString = "trUe";
Boolean isBoolean = false;
Boolean result1 = origString.ConvertToBoolean(out isBoolean); // result1 = true
这个 String
对象扩展将一个假定为可以转换的格式的 string
转换为布尔值。识别为 true
(不区分大小写)的字符串包括:true, on, yes, up, ok, good, 1, -1
。识别为 false
(不区分大小写)的字符串包括:false, off, no, down, not ok, bad, 0
。如果转换失败,则返回 false
。检查 isBoolean
的 out 值,以查看转换是否检测到布尔值。如果为 false
,则值未被转换。
Boolean IsBoolean(this String valueToExamine)
示例
String origString = "trUe";
Boolean isBoolean = false;
Boolean result1 = origString.IsBoolean(); // result1 = true
这个 String
对象扩展测试一个假定为可以转换的格式的 string
,以转换为布尔值。识别为 true
(不区分大小写)的字符串包括:true, on, yes, up, ok, good, start, 1, -1
。识别为 false
(不区分大小写)的字符串包括:false, off, no, down, not ok, bad, stop, 0
。如果转换失败,则返回 false
。否则,返回 true
。
Boolean IsOnlyDigits(this String testString, Boolean includePeriod = false)
示例
String string2Check = "Nine.";
Boolean result = string2Check.IsOnlyDigits(false); // result = false
string2Check = "999.0";
result = string2Check.IsOnlyDigits(false); // result = false as the period
// is not allowed as a part of digits (looking for whole digits only)
string2Check = "999.0";
result = string2Check.IsOnlyDigits(true); // result = true, as the period
// is allowed as a part of digits (looking for whole or decimal)
这个 String
对象扩展检查所有字符是否都是数字。用于测试数字的转换函数可能会将字母翻译成十六进制值。如果 includePeriod
设置为 true
,则将一个且仅一个句点视为数字,以便可以正确处理十进制数字 string
。
String GetOnlyDigits(this String testString, Boolean includePeriod = false)
示例
String value2Check = "Akery3mn.5n7X9.9c0";
String result = value2Check.GetOnlyDigits(false); // result = "357990"
value2Check = "USD $2,332.45";
result = value2Check.GetOnlyDigits(true); // result = "2332.45"
这个 String
对象扩展获取 string
中的所有数字,并忽略任何非数字字符。如果 includePeriod
为 true
,则 string
中的第一个句点将包含在结果中。
String GetOnlyLetters(this String testString, Boolean includeSpace = false)
示例
String value2Check = "Akery 3mn.5n7X9.9c0";
String result = value2Check.GetOnlyLetters(false); // result = "AkerymnnXc"
// (no internal spaces)
String value2Check = "John Smith 999-99-9999";
String result = value2Check.GetOnlyLetters(true).Trim(); // result = "John Smith"
// (internal spaces allowed)
这个 String
对象扩展获取 string
中的所有字母,并忽略任何非字母字符。但是,如果 includeSpace
为 true
,则包含在返回值中的任何空格。
String GetOnlyLettersAndDigits(this String testString,
BooleanincludePeriodAndSpace = false)
示例
String value2Check = "##### ... WARNING ... 123 ... #######";
String result = value2Check.GetOnlyLetters(false); // result = "WARNING123"
String value2Check = "!@#$%^&*()+{}[]John Smith USD211.78";
String result = value2Check.GetOnlyLetters(true).Trim(); // result = "John Smith
// USD211.78"
这个 String
对象扩展获取 string
中的所有字母和数字,并忽略所有其他字符,但当 includePeriodAndSpace
为 true
时,句点和空格除外。
Boolean IsOnlyLetters(this String testString, Boolean includeSpace = false)
示例
String string2Check = "Nine hundred forty two";
Boolean result = string2Check.IsOnlyLetters(false); // result = false
result = string2Check.IsOnlyLetters(true); // result = true
这个 String
对象扩展检查所有字符是否都是字母。如果 includeSpace
为 true
,则空格被接受,就像它们是字母一样。
Boolean IsOnlyLettersAndOrDigits(this String testString,
Boolean includePeriodAndSpace = false)
示例
String string2Check = "Nine hundred forty two 942.00";
Boolean result = string2Check.IsOnlyLettersAndOrDigits(false); // result = false
string2Check = "999.0";
result = string2Check.IsOnlyLettersAndOrDigits(false); // result = false
string2Check = "999.0";
result = string2Check.IsOnlyLettersAndOrDigits(true); // result = true
string2Check = "Nine hundred forty two 942.00";
result = string2Check.IsOnlyLettersAndOrDigits(true); // result = true
这个 String
对象扩展检查所有字符是否仅为字母和数字。如果 includePeriodAndSpace
为 true
,则所有句点和空格都被视为字母。
Boolean IsEmailFormat(this String email)
示例
String test1 = "John.Doe@domain";
Boolean result = test1.IsEmailFormat(); // result = false
test1 = "John.Doe@domain.net";
result = test1.IsEmailFormat(); // result = true
test1 = "Mary Smith@domain.net";
result = test1.IsEmailFormat(); // result = false
这个 String
对象扩展检查 string
是否是有效的电子邮件格式。它不检查电子邮件是否有效且可用。
DateTime GetDateTime(this String dateString, DateTime dateDefault)
示例
String time2Check = "02/29/2004 13:03:14.234";
DateTime result = time2Check.GetDateTime(DateTime.MinValue); // result = 2/29/2004
// 1:03:14 PM
time2Check = "02/29/2005 13:03:14.234";
result = time2Check.GetDateTime(DateTime.MinValue); // result =
// DateTime.MinValue because "02/29/2005 13:03:14.234" is not a valid datetime.
这个 String
对象扩展将 string
转换为 date
,或返回默认值。
Decimal GetDecimal(this String numberString, Decimal decimalDefault)
示例
String number = "3.14159";
Decimal result = number.GetDecimal(0.0m); // result = 3.14159
number = "1x";
result = number.GetDecimal(0.0m); // result = 0 since "1x" is not a number.
这个 String
对象扩展将 string
转换为十进制值,或返回默认值。
Int32 GetInt32(this String numberString, Int32 integerDefault)
示例
String num = "23";
Int32 result = num.GetInt32(Int32.MinValue); // result = 23
num = "1x";
result = num.GetInt32(Int32.MinValue); // result = Int32.MinValue
// since "1x" is not an integer
这个 String
对象扩展将 string
转换为 Int32
值,或返回默认值。
Int64 GetInt64(this String numberString, Int64 integerDefault)
示例
String num = "23456";
Int64 result = num.GetInt64(Int64.MinValue); // result = 23,456
num = "1x";
result = num.GetInt64(Int64.MinValue); // result = Int64.MinValue since
// "1x" is not an integer
这个 String
对象扩展将 string
转换为 Int64
值,或返回默认值。
Object GetDefaultValue(this Type t)
示例
Type dec = typeof(Decimal);
dec.GetDefaultValue();
Object result = dec.GetDefaultValue(); // result = 0
Type dtm = typeof(DateTime);
result = dtm.GetDefaultValue(); // result = 1/1/0001 12:00:00 AM
Type bmp = typeof(System.Drawing.Bitmap);
result = bmp.GetDefaultValue(); // result = Null
泛型扩展方法,如果存在,则返回该类型的默认值。这在通用实例中很有用,因为 default<T>
可能不起作用。
辅助函数和属性
枚举
DistanceUnitsOfMeasureEnum
Unassigned
Miles
Kilometers
Feet
Meters
这用于地理定位,指定距离的度量单位。
类
AddressGeoData
Double Latitude1
Double Longitude1
Double Altitude1
Double Latitude2
Double Longitude2
Double Altitude2
Double LinearDistance (value is calculated, read-only)
DistanceUnitsOfMeasureEnum UnitsOfMeasure
类构造函数
AddressGeoData(Double pLatitude1,
Double pLongitude1,
Double pAltitude1,
Double pLatitude2,
Double pLongitude2,
Double pAltitude2,
DistanceUnitsOfMeasureEnum pUnitsOfMeasure)
类方法
void SetUnitsOfMeasure(DistanceUnitsOfMeasureEnum lngUnitsOfMeasure)
指定在此类实例化期间使用的度量单位。
void SetLinearDistance(Double dDistance)
此类用于存储两个地理位置,指定纬度、经度和海拔。度量单位决定了与 LinearDistance
值相对应的单位。如果不知道或不需要海拔,则海拔可以为 0
。
String RowDelimiter (Get only)
此值可以应用于常量值。RowDelimiter
是电传打字机和其他设备中使用的相同的不可打印 ASCII 字符,用于指示新行,并且不太可能在 string
数据中看到。
String ColumnDelimiter (Get only)
此值可以应用于常量值。ColumnDelimiter
是电传打字机和其他设备中使用的相同的不可打印 ASCII 字符,用于指示新列,并且不太可能在 string
数据中看到。
此代码演示了如何使用自打字机时代以来就存在的标准分隔符,通过不可打印的分隔符构建行和列的表。
对于构建可以接受包含任何可打印字符(特别是通常用作分隔符的字符)的字段值的表很有用。
String TableDelimiter (Get only)
示例
String rowDelim = CommonHelpers.RowDelimiter;
String columnDelim = CommonHelpers.ColumnDelimiter;
String tblDelim = CommonHelpers.TableDelimiter;
StringBuilder sb = new StringBuilder();
sb.Append($"Winter{columnDelim}December{columnDelim}January
{columnDelim}February{rowDelim}");
sb.Append($"Spring{columnDelim}March{columnDelim}April{columnDelim}May{rowDelim}");
sb.Append($"Summer{columnDelim}June{columnDelim}July{columnDelim}August{rowDelim}");
sb.Append($"Fall{columnDelim}September{columnDelim}October
{columnDelim}November{rowDelim}{tblDelim}");
sb.Append($"FirstYears{columnDelim}2001{columnDelim}2002{columnDelim}2003{rowDelim}");
sb.Append($"SecondYears{columnDelim}2004{columnDelim}2005{columnDelim}2006{rowDelim}");
String twoTables = sb.ToString();
此值可以应用于常量值。TableDelimiter
是电传打字机和其他设备中使用的相同的不可打印 ASCII 字符,用于指示新数据表,并且不太可能在 string
数据中看到。
String FullComputerName (Get only)
示例
String result = CommonHelpers.FullComputerName;
获取 DNS 在任何域中都能识别的完整计算机名称。
String GetDNSName(String pComputerName = "")
示例
result = CommonHelpers.GetDNSName("13.249.120.102"); // result =
// "server-13-249-120-102.atl51.r.cloudfront.net"
获取给定计算机名称的 DNS 主机条目表名称。传入任何计算机名称。如果留空或为 null
,则使用当前计算机名称。
String CurDir (Get/Set)
示例
String result1 = CommonHelpers.CurDir; // gets the current working folder
CommonHelpers.CurDir = @"C:\"; // changes the current working folder to C:\
String result2 = CommonHelpers.CurDir; // gets the value of the folder
// you just changed to (C:\)
CommonHelpers.CurDir = result1; // sets the current working folder
// back to what it originally was
获取或设置当前工作目录的完全限定路径。对于服务,通过常规方式获取的当前目录显示 Windows 的System32目录,因为服务是在位于那里的 EXE 下运行的。此属性通过一个方法调用来处理在 IDE 中运行,另一个方法调用来处理编译运行。
Boolean AmIRunningInTheIDE (Get only)
示例
Boolean result = CommonHelpers.AmIRunningInTheIDE;
if (result)
{
txtResults.Text += "Running in the IDE";
}
else
{
txtResults.Text += "Running compiled";
}
此方法将返回 true
,如果此项目或任何作为编译代码调用此组件的项目正在 IDE 中运行。此方法返回 false
如果未使用 IDE。
Boolean IsInDomain()
示例
Boolean result = CommonHelpers.IsInDomain();
如果运行代码的计算机位于域中,则返回 true
。如果不在域中,则返回 False
。
String GetComputerDomainName()
示例
String result = CommonHelpers.GetComputerDomainName();
返回计算机所属的域。注意:如果用户以本地帐户登录,仍会返回计算机的域。如果已加入域,则返回包含域名的 String
,如果未加入域,则返回空 String
。
String GetFullComputerDomainName()
示例
String result = CommonHelpers.GetFullComputerDomainName();
返回完整域名而不是别名。
Boolean IsDaylightSavingsTime(DateTime dtmToTest)
示例
DateTime date2Check = "12/25/2020".GetDateTime(DateTime.MinValue);
result = CommonHelpers.IsDaylightSavingsTime(date2Check); // result is false.
如果提供的 datetime
落在夏令时期间,则为 True
。
Boolean IsDaylightSavingsTime()
示例
Boolean result = CommonHelpers.IsDaylightSavingsTime(); // result is true if in DST
如果当前是夏令时,则为 True
。
String CurrentTimeZoneDaylightName (Get only)
示例
String result1 = CommonHelpers.CurrentTimeZoneDaylightName; // result1 =
// "Eastern Daylight Time"
夏令时的当前时区名称。
String CurrentTimeZoneName (Get only)
示例
String result = CommonHelpers.CurrentTimeZoneDaylightName; // result =
// "Eastern Daylight Time"
当前时区的名称,无论是否为夏令时。
Int32 Asc(String strChar)
示例
Int32 result = CommonHelpers.Asc("T"); // result = 84
与 VB6 ASC 函数功能相同——给它一个字符,得到 ASCII 十进制数。
String Hex(Int32 lngValue)
示例
String result = CommonHelpers.Hex(320); // result = "140"
与 VB6 函数相同。将一个 32 位整数转换为 String hex
值。
Int32 GetCurrentCPUUsage()
示例
Int32 result = CommonHelpers.GetCurrentCPUUsage(); // result = 4 (as in 4%)
获取当前 % 处理器时间。
Int32 AvailableRAMinMB()
示例
Int32 result = CommonHelpers.AvailableRAMinMB(); // result = 13169
返回可用 RAM MB。
PingReply Ping(String strHostName, Int32 lngTimeout)
示例
PingReply result = CommonHelpers.Ping("www.microsoft.com", 1000); // Status-Success
// Roundtrip Time- 14ms
PingReply result = CommonHelpers.Ping("23.55.228.170", 1000); // Status-Success
// Roundtrip Time- 23ms
同步 ping 指定的服务器。返回一个 PingReply
实例,指示操作是否成功。
void GetLinearDistances(ref List<AddressGeoData> objAddressList)
示例
Double lat1 = 34.078717;
Double long1 = -84.2796787;
Double alt1 = (Double)CommonHelpers.ConvertMetersToFeet(1314);
Double lat2 = 30.8705832;
Double long2 = -84.2130001;
Double alt2 = (Double)CommonHelpers.ConvertMetersToFeet(350);
Double lat3 = 33.5867639;
Double long3 = -86.2874068;
Double alt3 = (Double)CommonHelpers.ConvertMetersToFeet(1322);
List<AddressGeoData> geoData = new List<AddressGeoData>()
{
new AddressGeoData(lat1, long1, alt1, lat2, long2, alt2,
DistanceUnitsOfMeasureEnum.Miles),
new AddressGeoData(lat3, long3, alt3, lat2, long2, alt2,
DistanceUnitsOfMeasureEnum.Miles)
}
CommonHelpers.GetLinearDistances(ref geoData);
List<AddressGeoData> geoData = new List<AddressGeoData>()
{
new AddressGeoData(lat1, long1, alt1, lat2, long2, alt2,
DistanceUnitsOfMeasureEnum.Kilometers),
new AddressGeoData(lat3, long3, alt3, lat2, long2, alt2,
DistanceUnitsOfMeasureEnum.Kilometers)
}
CommonHelpers.GetLinearDistances(ref geoData);
结果
The distance between 34.078717, -84.2796787, 4311.0236286 ft and 30.8705832,
-84.2130001, 1148.293965 ft is [333.26110261857286] miles.
The distance between 33.5867639, -86.2874068, 4337.2703478 ft and 30.8705832,
-84.2130001, 1148.293965 ft is [342.667119569297] miles.
The distance between 34.078717, -84.2796787, 1314 m and 30.8705832,
-84.2130001, 350 m is [212.70882559297874] kilometers.
The distance between 33.5867639, -86.2874068, 1322 m and 30.8705832,
-84.2130001, 350 m is [216.99218873575253] kilometers.
此函数使用 Haversine 公式计算两组纬度和经度之间的线性距离,并根据纬度调整地球半径。使用 Haversine 而不是 Vincenty 公式是为了保持计算更简单、处理器占用更少。此函数接受一个地址地理数据实例列表,并处理它们,更新列表中的各个类实例的线性距离属性。
Double GetLinearDistance(double Latitude1,
double Longitude1,
double Altitude1,
double Latitude2,
double Longitude2,
double Altitude2,
DistanceUnitsOfMeasureEnum lngUnitsOfMeasure)
示例
Double lat1 = 34.078717;
Double long1 = -84.2796787;
Double alt1 = (Double)CommonHelpers.ConvertMetersToFeet(1314);
Double lat2 = 30.8705832;
Double long2 = -84.2130001;
Double alt2 = (Double)CommonHelpers.ConvertMetersToFeet(350);
Double result = CommonHelpers.GetLinearDistance(lat1, long1, alt1, lat2, long2,
alt2, DistanceUnitsOfMeasureEnum.Miles);
Double result = CommonHelpers.GetLinearDistance(lat1, long1, alt1, lat2, long2,
alt2, DistanceUnitsOfMeasureEnum.Kilometers);
结果
The distance between 34.078717, -84.2796787, 4311.0236286 ft and 30.8705832,
-84.2130001, 1148.293965 ft is [333.26110261857286] miles.
The distance between 34.078717, -84.2796787, 1314 m and 30.8705832, -84.2130001,
350 m is [212.70882559297874] kilometers.
此函数使用 Haversine 公式计算两组纬度和经度之间的线性距离,并根据纬度调整地球半径。使用 Haversine 而不是 Vincenty 公式是为了保持计算更简单、处理器占用更少。此重载允许调用者指定返回值的所需度量单位。
Double GetLinearDistance(Double Latitude1,
Double Longitude1,
Double Altitude1,
Double Latitude2,
Double Longitude2,
Double Altitude2,
Boolean UseMiles)
示例
Double lat1 = 34.078717;
Double long1 = -84.2796787;
Double alt1 = (Double)CommonHelpers.ConvertMetersToFeet(1314);
Double lat2 = 30.8705832;
Double long2 = -84.2130001;
Double alt2 = (Double)CommonHelpers.ConvertMetersToFeet(350);
Double result = CommonHelpers.GetLinearDistance
(lat1, long1, alt1, lat2, long2, alt2, true);
Double result = CommonHelpers.GetLinearDistance
(lat1, long1, alt1, lat2, long2, alt2, false);
结果
The distance between 34.078717, -84.2796787, 4311.0236286 ft and 30.8705832,
-84.2130001, 1148.293965 ft is [333.26110261857286] miles.
The distance between 34.078717, -84.2796787, 1314 m and 30.8705832,
-84.2130001, 350 m is [212.70882559297874] kilometers.
此函数使用 Haversine 公式计算两组纬度和经度之间的线性距离,但允许用户选择英里和公里(UseMiles
参数)。
Double GetLinearDistance(Double Latitude1,
Double Longitude1,
Double Latitude2,
Double Longitude2,
DistanceUnitsOfMeasureEnum UnitsOfMeasure)
示例
Double lat1 = 34.078717;
Double long1 = -84.2796787;
Double lat2 = 30.8705832;
Double long2 = -84.2130001;
Double result = CommonHelpers.GetLinearDistance
(lat1, long1, lat2, long2, DistanceUnitsOfMeasureEnum.Miles);
Double result = CommonHelpers.GetLinearDistance
(lat1, long1, lat2, long2, DistanceUnitsOfMeasureEnum.Kilometers);
结果
The distance between 34.078717, -84.2796787, and 30.8705832,
-84.2130001 is [333.26110261857286] miles.
The distance between 34.078717, -84.2796787, and 30.8705832,
-84.2130001 is [212.70882559297874] kilometers.
此函数使用 Haversine 公式计算两组纬度和经度之间的线性距离,但不提供海拔(所有计算都假定是海平面上的地球曲面上的线性距离),并根据纬度调整地球半径。使用 Haversine 而不是 Vincenty 公式是为了保持计算更简单、处理器占用更少。此重载允许用户选择度量单位。
Double RadianToDegree(Double Coordinate)
示例
Double result = CommonHelpers.RadianToDegree(1.5d); // result = 85.94366926962348 degrees
将弧度转换为度。
Double CelciusToFahrenheit(Double DegC)
示例
Double result = CommonHelpers.CelsiusToFahrenheit(25); // result = 77 (25°C = 77°F)
将摄氏度转换为华氏度。
Double FahrenheitToCelsius(Double DegF)
示例
Double result = CommonHelpers.FahrenheitToCelsius(77); // result = 25 (77°F = 25°C)
将华氏度转换为摄氏度。
String StringToBase64(String String2Convert)
示例
String orig = "I am a string";
String result = CommonHelpers.StringToBase64(orig); // result = "SSBhbSBhIHN0cmluZw=="
将 String
转换为 Base64
。
String Base64ToString(String ByteString64)
示例
String base64 = "SSBhbSBhIHN0cmluZw==";
String result = CommonHelpers.Base64ToString(base64); // result = "I am a string"
将 Base64String
转换为 String
。
List<ManagementObject> GetNetworkPrinters()
示例
List<System.Management.ManagementObject> result = CommonHelpers.GetNetworkPrinters();
foreach (System.Management.ManagementObject printer in result)
{
String printerName = printer.Properties["Name"].Value.ToString();
String printerStatus = printer.Properties["Status"].Value.ToString();
String printerDefault = printer.Properties["Default"].Value.ToString();
txtResults.Text += $"{printerName} status: [{printerStatus}]
Default? [{printerDefault}]" + Environment.NewLine;
}
使用每个打印机的单个 ManagementObject
实例在一个 List
对象中获取网络打印机列表。
void SetIntBitValue(ref Int32 intValue, Int32 bitPlaceValue, Boolean setBitOn)
示例
Int32 bitmask = 0;
Int32 previousBitmask = bitmask;
CommonHelpers.SetIntBitValue(ref bitmask, 1, true);
txtResults.Text += $"The number [0] bit 1 is set on, resulting in 1." +
Environment.NewLine;
previousBitmask = bitmask;
CommonHelpers.SetIntBitValue(ref bitmask, 2, true);
txtResults.Text += $"The number [1] bit 2 is set on, resulting in 3." +
Environment.NewLine;
previousBitmask = bitmask;
CommonHelpers.SetIntBitValue(ref bitmask, 1, false);
txtResults.Text += $"The number [3] bit 1 is set off,
resulting in 2." + Environment.NewLine;
用于打开/关闭 Int
的位值的辅助方法。
Boolean GetIntBitValue(Int32 intValue, Int32 bitPlaceValue)
示例
Int32 bitmask = 3;
Boolean result = CommonHelpers.GetIntBitValue(bitmask, 1);
txtResults.Text += $"The number [3] bit 1 is True." + Environment.NewLine;
result = CommonHelpers.GetIntBitValue(bitmask, 2);
txtResults.Text += $"The number [3] bit 2 is True." + Environment.NewLine;
result = CommonHelpers.GetIntBitValue(bitmask, 3);
txtResults.Text += $"The number [3] bit 3 is True." + Environment.NewLine;
result = CommonHelpers.GetIntBitValue(bitmask, 4);
txtResults.Text += $"The number [3] bit 4 is False.";
用于获取 Int
的位值状态的辅助方法。
String GetStackInfo()
String GetStackInfo(Exception ex)
示例
String result = CommonHelpers.GetStackInfo();
txtResults.Text += $"The stack info from the current state is:
JHelpers_Demo.frmMain::GetStackInfo() @ Line [1587], Column [4]";
try
{
ArgumentException ex = new ArgumentException
("Parameter 1 (name) was null. It must be a string with length > 1.");
throw ex;
}
catch (Exception exUnhandled)
{
result = CommonHelpers.GetStackInfo(exUnhandled);
txtResults.Text += $"The stack info from the exception is:
JHelpers_Demo.frmMain::GetStackInfo() @ Line [1595], Column [5]";
}
这将在 String
中获取模块、函数、行号和列号信息。这在日志记录和创建异常时很有用,用于精确定义某事发生的位置。
第二个重载将基于异常的模块、函数、行号和列号信息获取为 String
。这在日志记录和创建异常时很有用,用于精确定义某事发生的位置。
String GetFullDateTimeStampForFileName(DateTime dtmDate)
示例
String result = CommonHelpers.GetFullDateTimeStampForFileName(DateTime.Now) // result =
// "2022-08-19T22.40.50.0712793-04.00"
这将在 String
中返回一个具有一致 datetime
格式的文件名。
Boolean IsFileText(out Encoding lngEncoding, String strFileName,
Int32 lngNumCharactersToRead)
示例
Boolean result = CommonHelpers.IsFileText(out encodingType,
@"C:\TestFile.txt", 80); // result = True
result = CommonHelpers.IsFileText(out encodingType,
@"C:\Windows\regedit.exe", 80); // result = False
检测文件是否为文本并检测其编码。
Int32 GetTotalHDDFreeSpace(String pDriveName)
示例
Int32 result = CommonHelpers.GetTotalHDDFreeSpace("C"); // result = 58085
返回可用磁盘空间的 MB。
Int32 GetTotalHDDSize(String pDriveName)
示例
Int32 result = CommonHelpers.GetTotalHDDSize("C"); // result = 961507
返回总空间 MB。
Int32 GetMinPasswordLength()
示例
Int32 result = CommonHelpers.GetMinPasswordLength(); // result = -1
返回域中的最小密码长度(如果存在)。如果不存在域,则返回 -1
。
Boolean IsIPAddress(String pValue, out IPAddress pIPValue)
示例
String ipAddr4 = "23.55.228.170";
IPAddress ipAddr4IP = null;
String ipAddr6 = "2600:140b:12:4ba::356e";
IPAddress ipAddr6IP = null;
Boolean result = CommonHelpers.IsIPAddress(ipAddr4, out ipAddr4IP);
txtResults.Text += $"Is \"{ipAddr4}\" an IPv4 address? {result}" + Environment.NewLine;
if (ipAddr4IP != null)
{
txtResults.Text += $"\"{ipAddr4}\" resolved as {ipAddr4IP.ToString()},
address family {ipAddr4IP.AddressFamily.ToString()}" + Environment.NewLine +
Environment.NewLine;
}
result = CommonHelpers.IsIPAddress(ipAddr6, out ipAddr6IP);
txtResults.Text += $"Is \"{ipAddr6}\" an IPv6 address? {result}" + Environment.NewLine;
if (ipAddr6IP != null)
{
txtResults.Text += $"\"{ipAddr6}\" resolved as {ipAddr6IP.ToString()},
address family {ipAddr6IP.AddressFamily.ToString()}" +
Environment.NewLine + Environment.NewLine;
}
ipAddr4 = "390.400.987.0";
result = CommonHelpers.IsIPAddress(ipAddr4, out ipAddr4IP);
txtResults.Text += $"Is \"{ipAddr4}\" an IPv4 address? {result}" + Environment.NewLine;
if (ipAddr4IP != null)
{
txtResults.Text += $"\"{ipAddr4}\" resolved as {ipAddr4IP.ToString()},
address family {ipAddr4IP.AddressFamily.ToString()}" +
Environment.NewLine + Environment.NewLine;
}
ipAddr6 = "abc:def";
result = CommonHelpers.IsIPAddress(ipAddr6, out ipAddr6IP);
txtResults.Text += $"Is \"{ipAddr6}\" an IPv6 address? {result}" + Environment.NewLine;
if (ipAddr6IP != null)
{
txtResults.Text += $"\"{ipAddr6}\" resolved as {ipAddr6IP.ToString()},
address family {ipAddr6IP.AddressFamily.ToString()}" + Environment.NewLine;
}
结果
Is "23.55.228.170" an IPv4 address? True
"23.55.228.170" resolved as 23.55.228.170, address family InterNetwork
Is "2600:140b:12:4ba::356e" an IPv6 address? True
"2600:140b:12:4ba::356e" resolved as 2600:140b:12:4ba::356e, address family InterNetworkV6
Is "390.400.987.0" an IPv4 address? False
Is "abc:def" an IPv6 address? False
检查 string
是否为 IPv4 或 IPv6 地址,并将 IPAddress
对象作为 out
参数返回。
String AssemblyTitle (Get only)
示例
String result = CommonHelpers.AssemblyTitle; // result = "JHelpers_Demo"
.NET
程序集的标题。
String AssemblyVersion (Get only)
示例
String result = CommonHelpers.AssemblyVersion; // result = "1.0.0.0"
.NET
程序集的版本。
String AssemblyDescription (Get only)
示例
String result = CommonHelpers.AssemblyDescription; // result = "Demonstrates how to
// use the JHelpers library."
.NET
程序集的描述。
String AssemblyProduct (Get only)
示例
String result = CommonHelpers.AssemblyProduct; // result = "JHelpers_Demo"
.NET
程序集的かと。
String AssemblyCopyright (Get only)
示例
String result = CommonHelpers.AssemblyCopyright; // result = "Copyright © 2020"
.NET
程序集使用的版权 string
。
String AssemblyCompany (Get only)
示例
String result = CommonHelpers.AssemblyCompany; // result = "Jeff Jones"
拥有 .NET
程序集的公司。
Boolean WriteToLog(String logFileName, String mainMessage, String secondMessage)
示例
Boolean result = CommonHelpers.WriteToLog(@"C:\Temp\TestFile.log",
"Main message to log", "Optional second message to log");
结果
The file [C:\Temp\TestFile.log] has these contents:
Date Time Message Addtl Info Module Method Line No.
2022-08-19T23:17:59.3811654-04:00 Main message to log Optional second message to log frmMain.cs Void WriteToLog() 2081
2022-08-19T23:18:00.3955869-04:00 Main message to log, entry 2 Optional second message to log frmMain.cs Void WriteToLog() 2083
2022-08-19T23:18:01.4112633-04:00 Main message to log, entry 3 Optional second message to log frmMain.cs Void WriteToLog() 2085
执行简单基于文件的日志写入的方法,该文件是制表符分隔的,并且具有列标题行。
关注点
我为此创建了一个签名的 NuGet 包,并将其集成到我的 JLogger6
NuGet 包中。
历史
当 | 作者 | 什么 |
2019年7月25日 | JDJ | Genesis |
2022年8月19日 | JDJ | .NET 6 更新 |