C#基础:通过一个实例来学习IFormattable接口,扩展方法
C#基础:通过一个实例来学习IFormattable接口,扩展方法
本实例中,定义了类型Student。Racer定义了几个属性和一个重载的ToString()方法,该方法以字符串格式显示学生信息。这个类实现了IFormattable接口,以支持格式字符串的不同变体。
Student类声明如下:
class Student:IFormattable
{
public string Name { get ; set ; } // 姓名
public string Age { get ; set ; } // 年龄
public string Address { get ; set ; } // 地址
public string StuNum { get ; set ; } // 学号
/// <summary>
/// People构造函数,给学生实体赋值
/// </summary>
public Student( string name, string age, string address, string stuNum)
{
this .Name = name;
this .Age = age;
this .Address = address;
this .StuNum = stuNum;
}
/// <summary>
/// 实现IFormattable接口,格式化输出学生信息
/// </summary>
public string ToString( string format, IFormatProvider formatProvider)
{
switch (format)
{
// 只输出姓名
case " N " : return " 姓名 " + Name;
// 输出学生全部信息
case " F " : return String.Format( " 姓名:{0} 年龄:{1} 学号:{2} 地址:{3} " , Name, Age, StuNum, Address);
// 信息格式化失败,抛出异常
default : throw new FormatException( " 信息格式化失败 " );
}
}
// 重载ToString方法,化简格式化输出的传入参数
public string ToString( string format)
{
return ToString(format, null );
}
}
扩展方法可以将方法写入最初没有提供该方法的类中。还可以把方法添加到实现某个特定接口的任何类中,这样多个类就可以使用相同的实现代码。
例如,String类是密封的,所以我们不能继承这个类,我们可以通过扩展给String类添加方法tostring(),如下所示
public static class StringExtension
{
public static void tostring( this string s)
{
Console.WriteLine( " Extension output: {0} " ,s);
}
}
如上面的代码所示,扩展方法在静态类中声明,定义为一个静态方法,其中第一个参数定义了它扩展的类型。tostring()方法扩展了String类,因为它的第一个参数定义为String类型。为了区分扩展方法和一般的静态方法,扩展方法还需要对第一个参数使用this关键字。
下面就可以使用String类型的扩展方法tostring()了,如下所示:
string s= " Hello World! " ; s.tostring();
结果在控制台显示的信息是:Extension output: Hello World!
下面看看本实例中,获取学生信息GetInfomation这个类的定义
static class GetInfomation
{
// 初始化一个学生信息列表
public static List<Student> stu;
/// <summary>
/// 给学生列表赋值
/// </summary>
/// <returns></returns>
public static IList<Student> getStudent()
{
if (stu == null )
{
stu = new List<Student> ();
stu.Add( new Student( " 小吕 " , " 23 " , " 中国成都 " , " 2940610410 " ));
stu.Add( new Student( " 小方 " , " 24 " , " 中国浙江 " , " 2940610411 " ));
stu.Add( new Student( " 小范 " , " 22 " , " 中国成都 " , " 2940610412 " ));
stu.Add( new Student( " 小龚 " , " 23 " , " 中国遵义 " , " 2940610413 " ));
stu.Add( new Student( " 小秦 " , " 24 " , " 中国成都 " , " 2940610624 " ));
}
return stu;
}
/// <summary>
/// 扩展方法,返回地址在成都的同学
/// </summary>
/// <param name="P"></param>
/// <returns></returns>
public static IEnumerable<Student> chengduStudent( this IList<Student> P)
{
// Linq查询,获取P列表中在成都的同学的信息
var query = P.Where(p => p.Address == " 中国成都 " ).OrderByDescending(p => p.StuNum).Select(p => p);
return query;
}
/// <summary>
/// 扩展方法,返回年龄为23的同学
/// </summary>
/// <param name="P"></param>
/// <returns></returns>
public static IEnumerable<Student> ageStident( this IList<Student> P)
{
var query = P.Where(p => p.Age == " 23 " ).OrderByDescending(p => p.StuNum).Select(p => p);
return query;
}
}
最后,主函数调用这些方法的实例如下所示:
class Program
{
static void Main( string [] args)
{
// 获取学生信息列表
var Result = GetInfomation.getStudent();
// 调用Linq查询扩展方法获取在成都的学生列表
IEnumerable<Student> chengdu_stu= Result.chengduStudent();
Console.WriteLine( " 地址在成都的学生信息列表: " );
foreach (Student p in chengdu_stu)
{
Console.WriteLine(p.ToString( " F " ));
}
Console.WriteLine( " -------------------------------------------- " );
Console.WriteLine( " 年龄为23岁的学生信息列表: " );
// 调用扩展方法获取年龄等于23的学生信息
IEnumerable<Student> age_stu = Result.ageStident();
foreach (Student s in age_stu)
{
Console.WriteLine(s.ToString( " F " ));
}
}
}
输出结果:
分类: .NET , C#
标签: .NET , C#基础 , IFormattable接口 , 扩展方法
作者: Leo_wl
出处: http://HdhCmsTestcnblogs测试数据/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息查看更多关于C#基础:通过一个实例来学习IFormattable接口,扩展方法的详细内容...