- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有两个接口(interface):
interface IDynamicControl
{
string Id { get; set; }
string Label { get; set; }
string Value { get; set; }
}
interface IDynamicList : IDynamicControl
{
IList ListItems { get; set; }
}
我有一个返回 IDynamicControl
的 ControlResolver
类 - 出于我的目的,我有 ASP.NET TextBoxes、CheckBoxes 和 DropDownLists 的包装类,它们实现了 IDynamicControl(DropDown 实现了 IDynamicList) .要点是我可以为解析器提供控件的名称,例如“文本框”,它会返回一个 IDynamicControl,它是经过修改的 ASP.NET 文本框。
这很完美,但问题是 DropDownList。也许我有脑放屁但我遇到的问题是当控件是下拉列表时,我必须对 IDynamicList 进行显式转换(因为解析器返回 IDynamicControl),所以我可以将项目添加到它用于显示。这通常不是问题,但动态控制的目的是我可以在外部存储字段类型并将其读入,因此我将不得不做一些丑陋的事情,例如:
string controlType = SomeService.GetControlType();
if (controlType == "dropdown")
{
var control = (IDynamicList)ControlResolver.ResolveControl(controlType);
// set up list items
}
else
{
var control = ControlResolver.ResolveControl(controlType);
// stuff with normal controls
}
但这看起来相当丑陋。我可以在基础中包含 ListItems 属性,然后将 NotImplemented 扔到不使用它的类中,但这违反了 ISP,甚至比 if 语句更臭。简而言之,我想让我的解析器返回一种类型的控件,这样我就不需要使用不同的 Resolve() 方法,但是在使用代码中,当且仅当控件是一个下拉菜单。
除非我弄错了或者我忘记了一些基本的东西,否则有没有更好的解决方案或者我应该只使用 if 语句?我不能使用基类,因为我所有的“动态”类都继承自 ASP.NET UI 基类。
最佳答案
单个方法不能返回不同的类型,除非它是非泛型的。在您的情况下,您不能传递泛型类型参数,因此无论如何您都必须应用某种显式转换。此外,由于您有不同的设置逻辑,您还必须应用一些条件检查。
你可以摆脱的一件事是条件 if
检查(想象一下在 10 种控制类型的情况下你需要多少 if's
),你可以使用 IDictionary
作为初始化函数的缓存,这样代码会更干净:
IDictionary<string, Func<IDynamicControl>> setupWorkerProvider
然后在单行中解析适当的设置函数:
// once setup setup provider
setupWorkerProvider.Add("dropdown", (dynamicControl) => { /*setup logic here*/ });
setupWorkerProvider.Add("button", (dynamicControl) => { /*setup logic here*/ });
// resolve initializer
var setupWorker = setupWorkerProvider[controlType];
// initialize control
setupWorker(control);
关于c# - 当一种类型需要额外的属性时尝试实现多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8083378/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!