Могу ли я объединить два и более классов, которые имеют общие свойства? - PullRequest
0 голосов
/ 02 марта 2012

У меня есть CheckBox и HtmlInputCheckBox.Эти проверенные свойства являются общими.Я хочу получить значение проверенного свойства. Я буду делать с использованием отражения, но я не хочу использовать отражение. Пример кода таким образом,

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

Это в gridview.

Я могу найтиих с использованием FindControl в gridview, но FindControl Return Type является 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 ]

3 голосов
/ 02 марта 2012

Лично я бы не стал этим заниматься.Просто напишите простой метод расширения, который проверяет тип элемента управления и, при необходимости, приводит его к типу, например

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();
0 голосов
/ 02 марта 2012

Поскольку это новые элементы управления, их необходимо зарегистрировать в 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...