我不知道如何使用"T“,我从来没有很好地理解它,但我相信答案将驻留在它周围的任何东西.
我有一个巨大的开关,它所做的就是将一个属性应用于一个对象,并将控件添加到一个集合中,比如提取>应用属性>添加,如下:
1开关
foreach (AdwizaControl control in form.AdwizaControls)
{
Panel panel = new Panel();
int x = 0, y = 0;
switch (control.Type)
{
case ControlType.CheckBox:
AdwizaCheckBox checkbox = (AdwizaCheckBox)control.AdwizaWebControl;
x = checkbox.X;
y = checkbox.Y;
panel.Controls.Add(checkbox);
break;
case ControlType.Bevel:
AdwizaBevel bevel = (AdwizaBevel)control.AdwizaWebControl;
bevel.Width = bevel.W;
bevel.Height = bevel.H;
panel.Controls.Add(bevel);
break;X和checkbox.Y是定义XML的属性,在这里,我们将控件设置为该大小
..。
第二开关(通过RadPageView (Telerik组件)中的控件循环)
foreach (RadPageView pageView in multiPage.PageViews)
{
int controlCount = pageView.Controls.Count;
for (int i = 0; i < controlCount; i++)
{
if (pageView.Controls[i].GetType() == typeof(AdwizaControl))
{
switch (((AdwizaControl)pageView.Controls[i]).Type)
{..。
case ControlType.Grid:
AdwizaGrid pageViewGrid = (AdwizaGrid)((AdwizaControl)pageView.Controls[i]).AdwizaWebControl;
pageViewGrid.Attributes.Add(
"style", string.Format("position:absolute;top:{0}px;left:{1}px;", pageViewGrid.Y + increaseY, pageViewGrid.X + increaseX));
pageView.Controls.Add(pageViewGrid);
break;
case ControlType.Hyperlink:
AdwizaHyperlink pageViewHyperlink = (AdwizaHyperlink)((AdwizaControl)pageView.Controls[i]).AdwizaWebControl;
pageViewHyperlink.Attributes.Add(
"style", string.Format("position:absolute;top:{0}px;left:{1}px;", pageViewHyperlink.Y + increaseY, pageViewHyperlink.X + increaseX));
pageView.Controls.Add(pageViewHyperlink);
break;
case ControlType.ImageBox:
AdwizaImageBox pageViewImageBox = (AdwizaImageBox)((AdwizaControl)pageView.Controls[i]).AdwizaWebControl;
pageViewImageBox.Attributes.Add(
"style", string.Format("position:absolute;top:{0}px;left:{1}px;", pageViewImageBox.Y + increaseY, pageViewImageBox.X + increaseX));
pageView.Controls.Add(pageViewImageBox);
break;
case ControlType.Label:
AdwizaLabel pageViewlabel = (AdwizaLabel)((AdwizaControl)pageView.Controls[i]).AdwizaWebControl;
pageViewlabel.Attributes.Add(
"style", string.Format("position:absolute;top:{0}px;left:{1}px;", pageViewlabel.Y + increaseY, pageViewlabel.X + increaseX));
pageView.Controls.Add(pageViewlabel);
break;
case ControlType.Slavebox:
AdwizaSlavebox pageViewSlavebox = (AdwizaSlavebox)((AdwizaControl)pageView.Controls[i]).AdwizaWebControl;
pageViewSlavebox.Attributes.Add(
"style", string.Format("position:absolute;top:{0}px;left:{1}px;", pageViewSlavebox.Y + increaseY, pageViewSlavebox.X + increaseX));
pageView.Controls.Add(pageViewSlavebox);
break;
case ControlType.Repeatbox:
AdwizaRepeatBox pageViewrepeatbox = (AdwizaRepeatBox)((AdwizaControl)pageView.Controls[i]).AdwizaWebControl;
pageViewrepeatbox.Attributes.Add(
"style", string.Format("position:absolute;top:{0}px;left:{1}px;", pageViewrepeatbox.Y + increaseY, pageViewrepeatbox.X + increaseX));
pageView.Controls.Add(pageViewrepeatbox);
break;它更大,因为它必须覆盖所有我正在使用的物体.
我怎么能在一个简单的电话里做到这一点?类似于:
ApplyPositionAttribute(
((AdwizaControl)pageView.Controls[i]).AdwizaWebControl);有办法简化这件事吗?
添加了开关语句
发布于 2010-03-02 08:48:07
如果AdwizaRepeatBox、AdwizaRepeatBox、AdwizaSlavebox和其他类没有扩展具有属性属性的单个类,那么最好在反射命名空间中搜索答案或重写代码,以便扩展单个类
如果它们扩展了单个类,而不是您要查找的代码,那么应该如下所示:
private void ApplyPositionAttribute<T>(AdwizaWebControl webControl) where T : InheritedClass
{
/* ... */
T adwizalControl = (T)webControl;
pageViewrepeatbox.Attributes.Add(
"style", string.Format("position:absolute;top:{0}px;left:{1}px;", pageViewrepeatbox.Y + increaseY, pageViewrepeatbox.X + increaseX));
pageView.Controls.Add(pageViewrepeatbox);
}编辑
如果所有adwizaControl都扩展具有属性属性的单个类,则使用此方法。如果扩展了X和Y属性,使用虚拟关键字覆盖基类声明
AdwizaWebControl webControl = ((AdwizaControl)pageView.Controls[i]).AdwizaWebControl;
webControl.Attributes.Add("style", string.Format("position:absolute;top:{0}px;left:{1}px;", webControl.Y + increaseY, webControl.X + increaseX));
pageView.Controls.Add(webControl);发布于 2010-03-02 08:43:53
我理解所有类AdwizaGrid、AdwizaHyperlink等都有AdwizaControl作为公共基类。我还假设Attributes是在基类中定义的。在这种情况下,您可以删除大部分复制,如下所示:
AdwizaControl control;
case ControlType.Grid:
control = ((AdwizaControl)pageView.Controls[i]).AdwizaWebControl;
break;
case ControlType.Hyperlink:
control = ((AdwizaControl)pageView.Controls[i]).AdwizaWebControl;
break;
...然后在案件之后:
control.Attributes.Add(
"style", string.Format("position:absolute;top:{0}px;left:{1}px;",
control.Y + increaseY, control.X + increaseX));
pageView.Controls.Add(control);在此之后,您可以用某种从控件类型到属性的映射来替换大开关(我不熟悉C#,所以我无法给出确切的提示,但在C++中,您可以使用函子或指向成员的指针)。
发布于 2010-03-02 09:00:26
在这种情况下,您不必使用泛型。如果您的所有控件都继承自AdvizaWebControl,您只需编写如下内容:
AdwizaWebControl webControl = ((AdwizaControl)pageView.Controls[i]).AdwizaWebControl;
webControl.Attributes.Add("style", string.Format("position:absolute;top:{0}px;left:{1}px;", pageViewGrid.Y + increaseY, pageViewGrid.X + increaseX));
pageView.Controls.Add(webControl);但是,如果您的类不从AdwizaWebControl继承,那么泛型不会有帮助。
https://stackoverflow.com/questions/2361721
复制相似问题