2013-08-30 5 views
2

При использовании типа .NET, который не является типом фрейма в String.Format, можно ли определить строки пользовательского формата для этого типа где-нибудь/каким-то образом?Создайте строки пользовательского формата для нового типа .NET для использования в String.Format?

Рассмотрим следующую 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. Есть ли интерфейс, который я могу реализовать? Должен ли я реализовать какой-либо другой тип и зарегистрировать его где-нибудь, чтобы сделать это?

Можно ли это достичь?

+0

Извините, если я не понял ваш вопрос, но это не то, что вы можете покрыть с IFormatProvider? См. Здесь: http://msdn.microsoft.com/en-us/library/0asazeez(v=vs.90).aspx –

+0

Что вы подразумеваете под этим? IFormatProvider обычно является объектом, специфичным для культуры, т.е. 'CultureInfo.InvariantCulture', я не думаю, что объект ничего не знает о моем новом типе. Или я здесь что-то не понимаю? –

ответ

2

Существует интерфейс IFormattable ...

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

Вероятно, у вас есть только реализовать его.

Интерфейс IFormattable преобразует объект в его строковое представление на основе строки формата и поставщика формата.

Try с

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

+0

Это похоже на работу, как и ожидалось, с помощью методов, которые я использовал, я добавил ': IFormattable', и это сработало. Теперь мне просто нужно выяснить, что такое минимальный контракт этого формата, но это, похоже, документировано. Благодаря! –