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

时间:2015-04-08 23:19:17

标签: c# console method-signature

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

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的内容传递给我...

3 个答案:

答案 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)方法,并将其留给调用者,以使用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);
}