2

当在String.Format中使用不是框架类型的 .NET 类型时,是否可以在某处/以某种方式为该类型定义自定义格式字符串?

考虑以下LINQPad程序:

void Main()
{
    var t = new Test(DateTime.Now);

    string.Format("{0}", t).Dump();
    string.Format("{0:dd}", t).Dump();
}

public class Test
{
    private readonly DateTime _DateTime;

    public Test(DateTime dateTime)
    {
        _DateTime = dateTime;
    }

    public override string ToString()
    {
        return _DateTime.ToString();
    }

    public string ToString(string format)
    {
        return _DateTime.ToString(format);
    }

    public string ToString(string format, IFormatProvider provider)
    {
        return _DateTime.ToString(format, provider);
    }
}

我希望第二次调用string.Format将值格式化为该内部日期的天数,但它仍显示完整的日期和时间,因此程序的输出是在测试时:

30.08.2013 13:53:55
30.08.2013 13:53:55

相反,我想要这样:

30.08.2013 13:53:55
30

显然string.Format不只是使用反射来找到我的.ToString. 有我可以实现的接口吗?我必须实现一些其他类型并将其注册到某个地方才能做到这一点吗?

这甚至有可能实现吗?

4

1 回答 1

2

IFormattable接口...

class MyObject : IFormattable
{
    public string ToString(string format, IFormatProvider formatProvider)
    {
        throw new NotImplementedException();
    }
}

可能你只需要实现它。

IFormattable 接口根据格式字符串和格式提供程序将对象转换为其字符串表示形式。

尝试

class Foo : IFormattable
{
    public string ToString(string format, IFormatProvider formatProvider)
    {
        return string.Format("Foo formatted as {0}", format != null ? format : "(null)");
    }
}

Console.WriteLine("{0}, {0:xxx}", new Foo());

{0}传递为null,而传递{0:xxx}xxx

于 2013-08-30T12:00:50.853 回答