编写辅助方法时自动继承所有方法签名? (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)
方法,并让调用者使用 ToString
或 String.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);
}
假设我正在尝试围绕现有的静态方法编写包装器方法。以控制台为例
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)
方法,并让调用者使用 ToString
或 String.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);
}