将动态控件作为参数传递给 C# 中的用户定义方法

Passing dynamic control as argument to user defined method in c#

我的问题很简单。我正在使用 asp.net 和 c#。

在我的页面中有很多控件,例如 DropDownListGridViewRepeater

并且在某些情况下我想将控件重置为

DropDownList1.DataSource = null;
DropDownList1.DataBind();

我想要什么,我喜欢构建一个通用的 Method 来重置所有控件,例如:

void SomeMethod(Template T)
{
    T.DataSource = null;
    T.DataBind();
}

这里的T可以是上面提到的任何一个asp controls

我听说使用 Template Type 可以做到这一点,但我不知道怎么做!!!

所以请提出解决方案。

首先,您必须从 class 中找到共同的 classinterface。根据我的小研究,它是 DataBoundControl

在此之后你创建一个通用方法(如果你想使用模板)并为继承设置一个约束,如下所示。

void SomeMethod<T>(T dataControl) where T : DataBoundControl
{
     T.DataSource = null;
     T.DataBind();
}

备注:

  1. 使用 DataBoundControl 仅适用于 DropDownListGridView 和其他从它继承的。 Repeater 直接继承自 Control class.

  2. 您可以将此方法用作 extension method

您混淆了泛型方法在 C# 中的工作方式。我认为通用方法不适用于此处。您可以在此处阅读有关如何(以及何时)使用它们的信息: https://msdn.microsoft.com/en-us/library/twcad0zb.aspx

至于您的具体情况,似乎大多数支持数据绑定的控件都派生自BaseDataBoundControl。最简单的解决方案是创建一个接受 BaseDataBoundControl 作为参数的方法,如下所示:

void SomeMethod(BaseDataBoundControl control)
{
    control.DataSource = null;
    control.DataBind();
}

我从你的问题中看到的一个例外是 Repeater。因为它不继承自 BaseDataBoundControl,所以我将实现一个重载方法,该方法接受 Repeater class 作为参数。

void SomeMethod(Repeater control)
{
    control.DataSource = null;
    control.DataBind();
}

结果是两个简单的方法,它们在代码的其他地方具有相同的用法,无论您是对从 BaseDataBoundControl 还是 Repeater 派生的类型进行操作 class。

您可以将其作为扩展方法来实现,这样所有 GridBoundControls 都可以使用该方法:

internal static class ExtenstionMethods
{
    internal static void ClearData( this DataBoundControl control )
    {
        control.DataSource = null;
        control.DataBind();
    }
}

你可以这样称呼它:

grdReports.ClearData();
ddlAnswers.ClearData();
etc.