我有一個重載泛型方法,用於獲取PageData
類型的對象的屬性值。屬性集合實現爲Dictionary<string, object>
。該方法用於避免檢查屬性是否不是null
並且具有值的乏味。強制在C#中使用特定的方法重載
一種常見模式是將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
,但是,我m得到StackOverflowException
,因爲它只是重新調用object
版本。
我怎樣才能讓編譯器意識到PageData
過載比object
過載更好?
是的,我發現這個工作。謝謝。 – 2010-10-07 08:55:57
@Greg B:在這種情況下,擴展方法的語法也應該起作用。我建議你再看一遍,因爲你可能會發現一些實際上很重要的潛在原因。 – 2010-10-07 08:58:14
爲了冒險猜測,可能擴展方法是在不同名稱空間的不同類中定義的,並且期望的重載不在範圍內。它應該起作用,因爲'data'的類型是'PageData',如果可用的話編譯器會選擇它。 – 2010-10-07 09:10:00