以下是解析C#的扩展方法的完整攻略:
什么是C#的扩展方法?
C#的扩展方法是一种特殊的静态方法,可以向已存在的类添加新的方法。使用扩展方法可以使已经封装好的类变得更加灵活,方便开发者自定义其功能。
如何定义扩展方法?
定义扩展方法需要以下几个要素:
- 扩展方法必须被定义在静态类中。
- 扩展方法必须使用
this
关键字作为方法的第一个参数,表示需要扩展的类型。 - 扩展方法必须定义在与扩展类型相同的命名空间中。
以下是一个简单的扩展方法示例:
namespace MyExtensionMethods
{
public static class StringExtensions
{
public static string AddDot(this string str)
{
return str + ".";
}
}
}
该示例中定义了一个名为AddDot
的扩展方法,用于将字符串类型添加一个点号.
。方法被定义在MyExtensionMethods
命名空间中的StringExtensions
静态类中。方法的第一个参数为string
类型,并使用this
关键字作为参数修饰符,表示这是一个对string
类型的扩展方法。
如何使用扩展方法?
使用扩展方法也很简单,只需要在需要调用方法的实例上直接调用即可。例如,要调用上面示例中的AddDot
方法,只需要在字符串实例后面加上.
和方法名即可:
string myString = "Hello";
string myStringWithDot = myString.AddDot();
运行后,myStringWithDot
的值将为"Hello."
。
示例 - 扩展IEnumerable类型
除了可以为常规类型添加扩展方法,我们还可以为接口类型添加扩展方法。例如,我们可以扩展IEnumerable<T>
接口,实现一个按照指定条件过滤集合的扩展方法。
namespace MyExtensionMethods
{
public static class EnumerableExtensions
{
public static IEnumerable<T> Filter<T>(this IEnumerable<T> collection, Func<T, bool> predicate)
{
foreach (var item in collection)
{
if (predicate(item))
{
yield return item;
}
}
}
}
}
该示例中定义了一个名为Filter
的扩展方法,用于按照指定的条件过滤实现了IEnumerable<T>
接口的集合。方法的第一个参数是需要扩展的类型IEnumerable<T>
,第二个参数是一个用于判断元素是否符合条件的Func<T, bool>
委托。方法返回一个IEnumerable<T>
类型的集合,其中只包含符合条件的元素。
该方法使用了yield return
语句进行迭代输出,避免了一次性将所有结果都载入内存的不足。
使用该方法的示例如下:
List<int> myList = new List<int>() { 1, 2, 3, 4, 5 };
var filtered = myList.Filter(x => x % 2 == 0); // 只保留偶数元素
foreach (var item in filtered)
{
Console.WriteLine(item);
}
运行后,控制台输出内容将为:
2
4
示例 - 扩展SqlDataReader类型
另外一个实际应用的案例是扩展SqlDataReader
类型以方便从查询结果中读取数据。
namespace MyExtensionMethods
{
public static class SqlDataReaderExtensions
{
public static T GetOrDefault<T>(this SqlDataReader reader, string columnName, T defaultValue = default(T))
{
if (reader.IsDBNull(reader.GetOrdinal(columnName)))
{
return defaultValue;
}
var columnValue = reader[columnName];
if (columnValue is T)
{
return (T)columnValue;
}
else
{
return defaultValue;
}
}
}
}
该示例中定义了一个名为GetOrDefault
的扩展方法,用于从实现了SqlDataReader
类型的查询结果中读取指定列的值。方法的第一个参数是需要扩展的类型SqlDataReader
,第二个参数是需要读取的列名。如果结果为NULL
,则返回默认值defaultValue
。
使用该方法的示例如下:
SqlCommand command = new SqlCommand("SELECT * FROM users WHERE id = @id", connection);
command.Parameters.AddWithValue("id", 1);
SqlDataReader reader = command.ExecuteReader();
if (reader.Read())
{
int id = reader.GetOrDefault<int>("id");
string name = reader.GetOrDefault<string>("name");
int age = reader.GetOrDefault<int>("age", defaultValue: 18);
// do something with the values
}
该代码片段从数据库中读取users
表中的数据,并通过GetOrDefault
方法读取id
、name
和age
三个列的值。其中,对于age
列,如果结果为NULL
,则默认为18岁。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:解析C#的扩展方法 - Python技术站