我可以组合两个或更多具有共同属性的类吗?

时间:2012-03-02 09:23:08

标签: c# asp.net gridview casting

我有一个CheckBox和一个HtmlInputCheckBox。这些是Checked属性很常见。我想获得check属性的价值。 我将使用反射,但我不想使用反射。这样的示例代码,

<input type="checkbox" id="checkBoxHtml" runat="server" />
<asp:CheckBox ID="checkbox" runat="server" />

这些是在gridview中。

我可以在gridview中使用FindControl找到它们,但FindControl返回类型是Control。 所以我需要使用Cast获取检查值。我想要访问的控件可以是不同类型。例如,CheckBox或HtmlInputCheckBox等。因此,我想使用一种类型进行转换。

我这么想,

public interface ICommonClass
{
    bool GetChecked();
}

public class NewCheckBox:CheckBox,ICommonClass
{
    public bool GetChecked()
    {
        return Checked;
    }
}

public class NewHtmlInputCheckBox:HtmlInputCheckBox,ICommonClass
{
    public bool GetChecked()
    {
        return Checked;
    }
}

var obj = (ICommonClass)gridview.FindControl("checkbox");
var obj = (ICommonClass)gridview.FindControl("checkboxHtml");

obj.GetChecked();

此代码无法运行。因为它在施放时会产生错误。正确的,这已经:)我给出了这个例子,我告诉了我的想法。这样的事情可以做到吗?

2 个答案:

答案 0 :(得分:3)

就个人而言,我不会为此烦恼。只需编写一个简单的扩展方法,检查控件的类型并进行适当的转换,例如

public static class ControlHelpers {
    public static bool GetChecked(this Control ctrl) {
        if(ctrl is CheckBox) {
            return ((CheckBox) ctrl).Checked;
        } else if(ctrl is HtmlInputCheckBox) {
            return ((HtmlInputCheckBox) ctrl).Checked;
        } else {
            throw new InvalidCastException("Some sort of CheckBox is required here.");
        }
    }
}

然后您可以像这样使用它:

bool checked = gridview.FindControl("checkbox1").GetChecked();

答案 1 :(得分:0)

由于这些是新控件,因此需要在web.config or at the page level中注册。然后你可以在页面中使用它们。

<myPrefix:NewCheckBox runat="server" ID="checkbox" />
<myPrefix:NewHtmlInputCheckBox runat="server" ID="checkBoxHtml" />

然后你可以使用他们的界面

var checkbox = (ICommonClass)gridview.FindControl("checkbox");
var checkBoxHtml = (ICommonClass)gridview.FindControl("checkBoxHtml")
var checked1 = checkbox.GetChecked();
var checked2 = checkBoxHtml .GetChecked();

CheckBox类型无法转换为ICommonClass接口,因为此类型不实现它,但新类型NewCheckBox可以实现。 GridView将包含此新类型的控件,以使ICommonClass受益。