C#3.0新特性 扩展方法
扩展方法可以使我们为现有的添加方法,现有的类可是是CLB的也可以是自己定义的。
注意事项:
通过this修饰方法第一个参数
方法声明在静态类中
方法通过对象调用
重要注意事项:
扩展方法和类中方法同名,扩展方法将永远不会被调用
扩展类型如果修改,扩展方法可能失效
下面我们讲一个扩展silverlight中RichTextBox的例子,在实际的开发中我们可能需要对RichTextBox取值或者设置值,在silverlight中并没有提供这个方法
实例如下:
建一个RichTextBox的扩展类RTBExtension:
代码
using System.Windows.Controls;
using System.Windows.Documents;
namespace ExtensionRichTextBox
{
/// <summary>
/// RTB扩展取值和设值方法
/// </summary>
public static class RTBExtension
{
/// <summary>
/// 取RTB值
/// </summary>
/// <param name="?"></param>
/// <returns></returns>
public static string GetRTBValue(this RichTextBox rtb)
{
string Text = string.Empty;
for (int i = 0; i < rtb.Blocks.Count; i++)
{
Paragraph p = (Paragraph)rtb.Blocks[i];
for (int j = 0; j < p.Inlines.Count; j++)
{
Run r = (Run)p.Inlines[j];
Text += r.Text;
}
}
return Text;
}
public static void SetRTBValue(this RichTextBox rtb, string data)
{
Paragraph p = new Paragraph();
Run r = new Run();
r.Text = data;
p.Inlines.Add(r);
rtb.Blocks.Clear();
rtb.Blocks.Add(p);
}
}
}
接下里我们在界面上拖一个RichtextBox TextBox 和两个Button,来测试这两个扩展方法
代码
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
}
/// <summary>
/// 设置值
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, RoutedEventArgs e)
{
RTBExtension.SetRTBValue(this.richTextBox1, this.txtBlock1.Text);
}
/// <summary>
/// 取值
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, RoutedEventArgs e)
{
this.txtBlock1.Text = RTBExtension.GetRTBValue(this.richTextBox1);
}
}
运行的效果:
从Textbox中取值设置给RichtextBox
从RichtextBox中取值设置给Textbox