假设我试图围绕现有的静态方法编写包装器方法。让我们以控制台为例。
public static void WriteWithPrefix(string prefix, ...)
{
Console.Write(prefix);
Console.Write(" - ");
// Console.Write(...)
}
Console.Write
方法有18个签名,涵盖原始类型的范围以及复制String.Format方法。
有没有办法编写这个帮助器类,以便它也可以接受Console.Write
通常接受的任何数据类型?
另一个例子:
public static void WriteWithTimestamp(...)
{
Console.Write(DateTime.Now.ToString());
Console.Write(": ");
// Console.Write(...)
}
当我调用WriteWithTimestamp
方法时,我希望能够将任何我可以提供给Console.Write
的内容传递给我...
答案 0 :(得分:1)
要以正常方式执行此操作,您需要为每个Console.Write重载函数设置重载,这意味着您的方法会出现多次重载。
但是,您可以使用dynamic
作为实现目标的替代方法:
public static void WriteWithTimestamp(dynamic value)
{
Console.Write(DateTime.Now.ToString());
Console.Write(": ");
Console.Write(value);
}
使用dynamic
将导致它在运行时评估并使用最合适的重载 。由于Console.Write
有一个接受object
作为参数的重载,因此也不应该导致异常。
答案 1 :(得分:0)
你必须重载你的方法并编写与Console.Write()一样多的签名,以及Console.Write()接受的相同类型的参数 或者..您可以编写一个方法,将所有Console.Write参数设置为null或某个值,如下所示:
public static void WriteWithTimestamp(string text = null, DateTime date = null, ...)
{
Console.Write(DateTime.Now.ToString());
Console.Write(": ");
// Console.Write(...)
}
现在您可以选择要传递给方法的参数,而不必重载它。
修改:使用dynamic
是更好的方法,不知道它存在: - )
答案 2 :(得分:0)
对于您的具体示例,我只会公开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);
}