编写辅助方法时自动继承所有方法签名? (C#)

Automatically inherit all method signatures when writing a helper method? (C#)

假设我正在尝试围绕现有的静态方法编写包装器方法。以控制台为例

public static void WriteWithPrefix(string prefix, ...)
{
    Console.Write(prefix);
    Console.Write(" - ");
    // Console.Write(...)

}

Console.Write 方法有大约 18 个签名,涵盖了基本类型的范围并复制了 String.Format 方法。

有没有办法编写此助手 class,使其也可以接受 Console.Write 通常接受的任何数据类型?

另一个例子:

public static void WriteWithTimestamp(...)
{
    Console.Write(DateTime.Now.ToString());
    Console.Write(": ");
    // Console.Write(...)
}

当我调用 WriteWithTimestamp 方法时,我希望能够将任何我也可以提供给 Console.Write...

的东西传递给它

要以正常方式执行此操作,您需要为每个 Console.Write 重载函数进行重载,这意味着您的方法有多个重载。

但是,您可以使用 dynamic 作为实现目标的替代方法:

public static void WriteWithTimestamp(dynamic value)
{
    Console.Write(DateTime.Now.ToString());
    Console.Write(": ");
    Console.Write(value);
}

使用 dynamic 将导致它在运行时 评估和使用最合适的重载。由于 Console.Write 有一个重载接受 object 作为参数,这也不应该导致异常。

您必须重载您的方法,并使用 Console.Write() 接受的相同类型的参数编写与 Console.Write() 一样多的签名 或者..您可以编写一种方法,将 Console.Write 的所有参数设置为空或像这样的某个值:

public static void WriteWithTimestamp(string text = null, DateTime date = null, ...)
{
    Console.Write(DateTime.Now.ToString());
    Console.Write(": ");
    // Console.Write(...)
}

现在您可以选择将哪些参数传递给您的方法,而无需重载它。

编辑:使用dynamic是更好的方法,不知道它存在:-)

对于您的具体示例,我只公开一个 WriteWithTimestamp(string) 方法,并让调用者使用 ToStringString.Format 将其参数转换为字符串来电。

但是,假设你想问一般的问题,我会建议接受一个 params object[] 数组,并将它传递给通过反射解析的静态方法的调用:

public static void Main(string[] args)
{
    Console.WriteLine("Location is ({0},{1})", 4, 7);
    WriteWithTimestamp("Location is ({0},{1})", 4, 7);
}

public static void WriteWithTimestamp(params object[] parameters)
{
    Console.Write(DateTime.Now.ToString());
    Console.Write(": ");

    var parameterTypes = parameters.Select(p => p.GetType()).ToArray();
    var writeLine = typeof(Console).GetMethod("WriteLine", parameterTypes);
    writeLine.Invoke(null, parameters);
}