我可以合并两个或多个具有公共属性的类吗

本文关键字:属性 合并 两个 我可以 | 更新日期: 2023-09-27 18:26:19

我有一个CheckBox和一个HtmlInputCheckBox。这些都是Checked属性。我想得到已检查属性的值我会使用反射,但我不想使用反射这样的示例代码,

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

这些是网格视图。

我可以在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();

此代码不运行。因为它在进行强制转换时会出错。正确的一个,这个已经:)我举了这个例子,因为我说出了我的想法。这样的事情可以做吗?

我可以合并两个或多个具有公共属性的类吗

就我个人而言,我不会为这些烦恼。只需编写一个简单的扩展方法,检查控件的类型并根据需要进行强制转换,例如

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();

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

<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受益。