65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIconemptyStarIcon

4.00/5 (7投票s)

2022年8月22日

CPOL

11分钟阅读

viewsIcon

9540

一个包含通用有用方法和功能的库,可以节省开发人员编写代码来完成这些平凡任务的时间。目标平台为 .NET 6。

引言

JHelpers6 是一个 .NET 6 库组件,可用于任何 .NET 6 兼容项目以及任何受支持的操作系统。它是一个包含通用有用方法和功能的库,可以节省开发人员编写代码来完成这些平凡任务的时间——或者更糟的是,避免在多个地方编写同一个功能的多个版本。JHelpers6 就出于这个原因被用在了我的 JDAC6 和 JLogger6 NuGet 包中。

要了解使用 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 中出现的次数。扩展方法返回 0n 次出现次数的 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 中的所有数字,并忽略任何非数字字符。如果 includePeriodtrue,则 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 中的所有字母,并忽略任何非字母字符。但是,如果 includeSpacetrue,则包含在返回值中的任何空格。

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 中的所有字母和数字,并忽略所有其他字符,但当 includePeriodAndSpacetrue 时,句点和空格除外。

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 对象扩展检查所有字符是否都是字母。如果 includeSpacetrue,则空格被接受,就像它们是字母一样。

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 对象扩展检查所有字符是否仅为字母和数字。如果 includePeriodAndSpacetrue,则所有句点和空格都被视为字母。

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 更新
JHelpers 6 - 一个优秀而忠诚的仆人 - CodeProject - 代码之家
© . All rights reserved.