素人の言葉で言えば、拡張メソッドは、タイプ自体のコードを変更またはコンパイルする必要なしに、String、Int、DateTime、DataRow、DataTableなどのこれらのタイプに1つ以上のメソッドを追加することです。
例1:時間タイプ変数のフォーマットと表示
従来の文章:
DateTime now = DateTime.Now;
string time = now.ToString( "yyyy-mm-dd hh:mm:ss");
拡張方法:
拡張メソッドを定義する
using System;
namespace DB.MySql
{
public static class ExtHelper
{
/// <summary>
/// 日期格式化
/// </summary>
public static string DateToString(this DateTime dt)
{
return dt.ToString("yyyy-mm-dd hh:mm:ss");
}
}
}
上記のコードは、DateTime型に拡張メソッドが定義されており、メソッド名がDateToStringであることを示しています。
プロジェクトで時間タイプの変数をフォーマットする場合は、「now。」と入力すると、自動的にプロンプトが表示されるDateToString()メソッドがあり、日付タイプのインスタンスメソッドのように直接呼び出すことができます。それ自体、非常に便利です。
例2:文字列を数値に変換する
従来の文章:
/// <summary>
/// 字符串转数字
/// </summary>
public static int StrToInt(string s)
{
int id;
int.TryParse(s, out id);//这里当转换失败时返回的id为0
return id;
}
転送:
文字列s = "2";
int i = StrToInt(s);
拡張方法:
/// <summary>
/// 将字符串转换为Int
/// </summary>
/// <param name="t"></param>
/// <returns>当转换失败时返回0</returns>
public static int StrToInt(this string t)
{
int id;
int.TryParse(t, out id);//这里当转换失败时返回的id为0
return id;
}
転送:
文字列s = "2";
int i = s.StrToInt();
例3:日付が2つの日付の範囲内にあるかどうかを判別します(パラメーターを使用した拡張方法)
拡張方法:
/// <summary>
/// 此时间是否在此范围内
/// </summary>
/// <param name="t"></param>
/// <param name="startTime"></param>
/// <param name="endTime"></param>
/// <returns></returns>
public static bool IsRange(this DateTime t, DateTime startTime, DateTime endTime)
{
if ((startTime - t).TotalSeconds > 0)
{
return false;
}
if ((endTime - t).TotalSeconds < 0)
{
return false;
}
return true;
}
呼び出し:t1がdtStartとdtEndの時間範囲内にあるかどうかを判別します
DateTime t1 = DateTime.Now;
DateTime dtStart = DateTime.Now.AddDays(-1);
DateTime dtEnd = DateTime.Now.AddDays(1);
bool b = t1.IsRange(dtStart、dtEnd);
上記の3つの簡単な例から、拡張メソッドは実際の開発で非常に実用的であることがわかります。拡張メソッドの概要は次のとおりです。
拡張メソッドの要素:
1.このメソッドは静的メソッドである必要があります(メソッドは静的変更を使用します)
2。このメソッドは静的クラスに配置する必要があります(クラスは静的変更を使用します)
3。このメソッドの最初のパラメーターはthisで始まり、このメソッドを指定する必要がありますどのタイプから拡張するか(DateTime、stringなど)
拡張メソッドの機能:
1.拡張メソッドが拡張されるタイプは、このタイプの変数である必要があります。他のタイプは使用できません。DateTimeタイプの拡張のインスタンスは、DateTimeタイプの変数のみになります。Out()
2。拡張メソッドの場合この後のパラメーターは、メソッドのパラメーターに属していません。例1と2は、どちらもパラメーターなしの拡張メソッドです。この例の後のDateTime dtは、拡張メソッドが日付型から拡張されていることを示します。インスタンス3はパラメータ化された拡張メソッドであり、startTimeとendTimeは2つの実際のパラメータ
です。3 。拡張メソッドとインスタンスメソッドのシグネチャが同じ場合、インスタンスメソッドが最初に呼び出され
ます。4。親クラスから拡張されたメソッドは次のようになります。サブクラスのオブジェクトによって直接使用される使用
5.実装クラスのオブジェクトによって直接使用できるインターフェイス上
の拡張メソッド。6。拡張メソッドは、最終的にコンパイラによって静的クラスにコンパイルされます。静的メソッド() 、この場合、now.DateToString()は最終的にDateHelper.DateToString(now)にコンパイルされます。これが、その本質です。