Я знаю, что это не отвечает на ваш вопрос, но, поскольку нет способа сделать то, о чем вы просите, я подумала, что поделюсь своим подходом, чтобы другие могли его увидеть.
Я использую гибрид предложенных Марком и Эндрю решений.
В моем приложении все доменные сущности происходят от абстрактного базового класса:
public abstract class Entity
{
/// <summary>
/// Returns a <see cref="System.String"/> that represents this instance.
/// </summary>
public override string ToString()
{
return this is IHasDescription
? ((IHasDescription) this).EntityDescription
: base.ToString();
}
}
Сам интерфейс определяет только простой метод доступа:
public interface IHasDescription : IEntity
{
/// <summary>
/// Creates a description (in english) of the Entity.
/// </summary>
string EntityDescription { get; }
}
Итак, теперь есть встроенный резервный механизм - или, другими словами, Entity
, который реализует IHasDescription
, должен обеспечивать EntityDescription
, но любой Entity
все еще может преобразовывать в строку.
Я знаю, что это в корне не отличается от других решений, предлагаемых здесь, но мне нравится идея минимизации ответственности базового типа Entity
, так что реализация интерфейса описания остается необязательной, но вы вынуждены фактически реализовать метод description, если вы реализуете интерфейс.
ИМХО, интерфейсы, которые реализуются базовым классом object
, не должны "считаться" как реализованные - было бы неплохо иметь для этого опцию компилятора, но, ну да ладно ...