gpt4 book ai didi

c# - 当一种类型需要额外的属性时尝试实现多态性

转载 作者:行者123 更新时间:2023-11-30 12:33:59 26 4
gpt4 key购买 nike

我有两个接口(interface):

interface IDynamicControl
{
string Id { get; set; }
string Label { get; set; }
string Value { get; set; }
}

interface IDynamicList : IDynamicControl
{
IList ListItems { get; set; }
}

我有一个返回 IDynamicControlControlResolver 类 - 出于我的目的,我有 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/

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