У меня есть перегруженный универсальный метод, используемый для получения значения свойства объекта типа PageData
.Коллекция свойств реализована как Dictionary<string, object>
.Этот метод используется для того, чтобы избежать утомительной проверки, имеет ли свойство значение null
и имеет значение.
Обычным шаблоном является привязка набора PageData
к повторителю.Тогда внутри репитера каждый PageData
является Container.DataItem
, который имеет тип object
.
. Я написал оригинальный метод расширения для PageData:
public static T GetPropertyValue<T>(this PageData page, string propertyName);
Но при привязке данных,Вы должны привести Container.DataItem
к PageData
:
<%# ((PageData)Container.DataItem).GetPropertyValue("SomeProperty") %>
Я немного почесался и подумал: не могу ли я перегрузить метод расширения объекта, поместите этот метод в отдельное пространство имен (такчтобы не загрязнять все, что наследует object
), и использовать это пространство имен только в моих файлах aspx / ascx, где я знаю, что у меня есть коллекция PageData
.Благодаря этому я могу избежать беспорядочного приведения в моем aspx / ascx, например:
// The new overload
public static T GetPropertyValue<T>(this object page, string propertyName);
// and the new usage
<%# Container.DataItem.GetPropertyValue("SomeProperty") %>
Внутри object
версии GetPropertyValue
я приведу параметр page
к PageData
public static T GetPropertyValue<T>(this object page, string propertyName)
{
PageData data = page as PageData;
if (data != null)
{
return data.GetPropertyValue<T>(propertyName);
}
else
{
return default(T);
}
}
, а затем переадресовать вызов на то, что, как я ожидал, будет PageData
версией GetPropertyValue
, однако я получаю StackOverflowException
, поскольку он просто повторно вызывает object
версию.
Как заставить компилятор понять, что перегрузка PageData
лучше, чем перегрузка object
?