参数数目可变的扩展方法

本文关键字:扩展 方法 数数 参数 | 更新日期: 2023-09-27 18:15:44

我已经创建了这个helper类RichTextBoxHelper,它有一个扩展方法,我想编写另一个WriteLine方法或重写这个方法(哪个解决方案是最好的),以便能够在它下面呈现的函数中使用它。谢谢你。

public static class RichTextBoxHelper
{
    public static void WriteLine(this RichTextBox txtLog, object line)
    {
        txtLog.AppendText(line + Environment.NewLine);
    }
}
private void selectToolStripMenuItem_Click(object sender, EventArgs e)
{
    var vehicles = new List<Tuple<string, string, int>>
    {
        Tuple.Create("123","VW",1999),
        Tuple.Create("234","Ford",2009),
        Tuple.Create("567","Audi",2005),
        Tuple.Create("678","Ford",2003),
        Tuple.Create("789","Mazda",2003),
        Tuple.Create("999","Ford",1965)
    };
    var fordCars = vehicles.Where(v => v.Item2 == "Ford")
                         .Select(v => new Car
                         {
                             VIN = v.Item1,
                             Make = v.Item2,
                             Year = v.Item3
                         });
    foreach (var item in fordCars)
        txtLog.WriteLine("Car VIN:{0} Make:{1} Year:{2}", item.VIN, item.Make, item.Year);                                    
} 

参数数目可变的扩展方法

是的,这完全有可能。它被称为方法重载,它在扩展方法类和普通类上工作得一样好。

你的新方法需要的签名是:

public static void WriteLine(
    this RichTextBox txtLog, 
    string format, 
    params object[] args)
{
    // ...
}

只要把它和你的另一个放在同一个类中,你就可以在适当的时候使用这两个。

或者你可以用下面的方式调用你现有的方法:

txtLog.WriteLine(
    String.Format(
        "Car VIN:{0} Make:{1} Year:{2}", 
        item.VIN, 
        item.Make, 
        item.Year));         

我认为dav_i的答案是正确的,但我更喜欢你写你的IsIn方法的扩展方法如下,因为你可以在任何地方使用它的每一种不同类型的变量:

public static class ExtensionMethods
{
    public static bool IsIn<T>(this T keyObject, params object[] collection)
    {
        return collection.Contains(keyObject);
    }
}

方法的用法如下:

if (intValue.IsIn( 2, 3, 7 ))
        {
            do something...
        }
if (stringVlaue.IsIn("a","b","c"))
  {
           do something...
  }