gpt4 book ai didi

c# - 在 C# 中动态转换 Page.LoadControl

转载 作者:行者123 更新时间:2023-11-30 15:04:35 25 4
gpt4 key购买 nike

我是第一次编写一些用户控件,我想知道是否有一种方法可以清理我的一些代码。 (如果您想了解我正在从事的工作的更多背景信息,请参阅 this question。)

我有一个 BaseControl 类,它基本上解析一些 XML 数据,然后根据该数据中包含的内容调用适当的 UserControl 并发送数据在路上。这是一个例子:

public partial class BaseControl : User Control
{
protected void Page_Load(object sender, EventArgs e)
{
... //code that parses the data
var renewalDef = effort.Attributes["renewal_def"].Value;
var effortNumber = effort.Attributes["renewal_effort_number"].Value;
if (effortNumber == "1")
{
var effortControl = (NAVLEffort1) Page.LoadControl("~/NAVLSeriesControls/NAVLEffort1.ascx");
effortControl.transactionData = transaction; //'transaction' is a Hashtable object
HtmlContent.Controls.Add(effortControl); //'HtmlContent' is a PlaceHolder control on BaseControl.ascx page
}
if (effortNumber == "2")
{
var effortControl = (NAVLEffort2) Page.LoadControl("~/NAVLSeriesControls/NAVLEffort2.ascx");
effortControl.transactionData = transaction; //'transaction' is a Hashtable object
HtmlContent.Controls.Add(effortControl); //'HtmlContent' is a PlaceHolder control on BaseControl.ascx page
}
if (effortNumber == "3")
{
var effortControl = (NAVLEffort3) Page.LoadControl("~/NAVLSeriesControls/NAVLEffort3.ascx");
effortControl.transactionData = transaction; //'transaction' is a Hashtable object
HtmlContent.Controls.Add(effortControl); //'HtmlContent' is a PlaceHolder control on BaseControl.ascx page
}
// and so on...
}
}

这不是我编写的实际代码,它只是我可以前往的地方的示例。我想做的更像这样:

...
var effortControlFileString = string.Format("~/NAVLSeriesControls/{0}Effort{1}.ascx", renewalDef, effortNumber);
var effortControl = (renewalDef + "Effort" + effortNumber) Page.LoadControl(effortControlFileString);
effortControl.transactionData = transaction;
HtmlContent.Controls.Add(effortControl)
...

有什么办法可以解决这个问题吗?

最佳答案

界面

您可以让所有控件实现一个通用接口(interface)并转换为该接口(interface)。

public interface IMyInterface
{
object TransactionData
{
get;
set;
}
}

Control effortControl = Page.LoadControl(path);
HtmlContent.Controls.Add(effortControl);

IMyInterface obj = (IMyInterface)effortControl;
obj.TransactionData = transaction;

查看此 working example在在线 IDE 中。

基类

您还可以使用抽象基类并强制转换为该类型并获得相同的结果。您将需要使用继承自 UserControl 的基类。这将避免有两个对象引用(如我上面的示例中所示),因为它可以转换为 UserControl

上面的例子变成:

MyCustomControlType c = (MyCustomControlType)Page.LoadControl(path);
HtmlContent.Controls.Add(c);
c.TransactionData = transaction;

如果每个控件类型的逻辑不同,那么您可能需要转换为每个特定类型(基本上是一个大的 if/else block )并单独处理每个控件。换句话说,如果您需要根据控件的类型执行不同的操作,您将需要类型感知的逻辑。

为了完整起见,我会提到您也可以使用 DLR但我建议反对。您将放弃编译时类型安全和性能以减少一点代码。

关于c# - 在 C# 中动态转换 Page.LoadControl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10049277/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com