【发布时间】:2013-07-30 07:58:53
【问题描述】:
我在 ASP.NET 网页中有一个 GridView 和一个 DetailsView,我需要提取其中一个或另一个以获取其信息,并且为此创建了一个函数。 GridView 和 DetailsView 都有一个名为 Rows 的属性,这是我需要在我的函数中使用的。
所以在代码中我有如下内容:
// Where dv is DetailsView and gv is GridView
if(someBool)
foo(dv);
else
foo(gv);
foo 如下所示:
void foo(SomeBaseClassOrInterface dv) {
foreach(var row in dv.Rows) {
Use(row.Cells[2].Text); // Simply read each row
}
}
我认为我可以使用同一个函数,而不是创建两个不同的函数,因为 DetailsViewRowCollection 和 GridViewRowCollection 的操作是彼此的镜像。问题是我没有看到有共享 Rows 属性的基类。
我尝试创建两个继承自 DetailsView 和 GridView 的类,并简单地使用它们父级的 Row 属性,它们都实现了一个接口,然后我在我的主代码中使用该接口,但这似乎不起作用。原因是 DetailsView 和 GridView 的 Rows 的返回类型不同,这两种返回类型都继承自 IEnumerable,但任何实现该接口的类都需要使其 Row 属性也返回一个 IEnumerable,使用泛型绕过此限制,但随后在我的调用代码中失败它抱怨我的实现 GridView 和 DetailsView 的对象无法转换为 Interface 类型。
我觉得我缺少一个非常简单的解决方案。也许在这种情况下复制代码可能更容易?
我正在尝试找到一种可以避免重复代码的好方法。
谢谢
【问题讨论】:
-
因为它们不共享基类(
Object除外),就像你说的那样,真的没有办法用相同的方法处理代码。我认为您已通过将逻辑提取到Use方法中来尽可能地简化它。这样,您复制的唯一代码就是循环,这在 IMO 中非常公平。