我有一个重载泛型方法,用于获取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