Я совершенно не согласен с использованием свойства устаревшего для этого по нескольким причинам.
Для начала у вас будет предупреждение о методе ToString (), который вы переопределили и пометили свойством устаревшего:
[Obsolete("dont' use", true)]
public override string ToString()
{
throw new Exception("don't use");
}
выдает это предупреждение:
Предупреждение 1 Устаревший член ClassLibrary1.Foo.ToString () переопределяет устаревший член object.ToString () d: \ source \ ClassLibrary1 \ ClassLibrary1 \ Class1.cs 11 32 ClassLibrary1
так что теперь вы застряли с постоянным предупреждением в вашем коде. Кроме того, это не совсем решит вашу проблему. Что происходит, когда что-то в структуре неявно вызывает ToString () сейчас? Результатом следующего кода является то, что код в теле ToString () по-прежнему вызывается:
Foo myObj = new Foo();
Console.WriteLine(myObj);
Так что теперь у вас есть предупреждение в вашем коде, и оно не мешает разработчику делать то же самое снова и снова. Я думаю, что правильным шагом здесь является попытка найти способ вызвать соответствующее исключение во время выполнения, а не пытаться связываться с объектными контрактами .net.
Предложение по отлову проблемы во время компиляции:
Я понял, что ранее не предлагал решения этой проблемы. Я действительно не знаю, в каком формате ваш идентификатор, наверняка, поэтому я только догадываюсь, что это int, но почему бы не защитить то, что создает URL с помощью строки запроса, и передать идентификатор как int. Таким образом, разработчик не может случайно передать какую-то бессмысленную строку без ошибки компиляции. Вот так например:
public string CreateItemUrl(int itemId)
{
return string.Format("someurl.aspx?id={0}", itemId);
}
Теперь, позвонив по этому номеру:
CreateItemUrl(myObj.Id);
становится гораздо более типизированным и менее подверженным ошибкам, чем:
string theUrl = string.Format("someurl.aspx?id={0}", myObj);