gpt4 book ai didi

c# - Dictionary> 从其中的 Func<> 访问包含的 Dictionary

转载 作者:太空狗 更新时间:2023-10-29 23:15:03 25 4
gpt4 key购买 nike

这有点奇怪。

我正在构建一个 Web 应用程序,我正在组合一个简单的类似工厂模式的东西来处理一些对象实例化。我不喜欢又大又丑的 switch-case block ,所以我倾向于这样做:

public enum Option
{
Option1,
Option2,
Option3
}

public Dictionary<Option, Func<MyBaseClass>> OptionMapping
= new Dictionary<Option, Func<MyBaseClass>>
{
{ Option1, () => new DerivedClassOne() },
{ Option2, () => new DerivedClassTwo() },
{ Option3, () => new DerivedClassThree() }
};

然后开关 block 变为MyBaseClass selectedThing = OptionMapping[currentOption](); .

我在编写这段代码时突然想到,如果您遇到两个选项需要相同操作的情况,您最终会得到相同的 Func<>。在两个地方,我宁愿避免。假设目前你不能仅仅重构一些逻辑来将这两个选项合并为一个,我想知道是否有办法获得一个 Func调用对方。

我的第一个想法是:

public Dictionary<Option, Func<MyBaseClass>> OptionMapping 
= new Dictionary<Option, Func<MyBaseClass>>
{
{ Option1, () => new DerivedClassOne() },
{ Option2, () => new DerivedClassTwo() },
{ Option3, () => this[Option1]() }
};

但是在 LINQPad 中的快速测试告诉我这不起作用,因为当然是 this指的是编写代码的类,而不是 Dictionary (显然我在 this 变化无常的语言上花费了太多时间)。我的第二个想法是将其更改为 () => OptionMapping [Option1]() , 但这会导致您尝试使用 OptionMapping 的错误在初始化之前。你当然可以这样做:

public Dictionary<Option, Func<MyBaseClass>> OptionMapping 
= new Dictionary<Option, Func<MyBaseClass>>
{
{ Option1, () => new DerivedClassOne() },
{ Option2, () => new DerivedClassTwo() }
};
OptionMapping.Add(Option3, () => OptionMapping [Option1]());

哪个有效,但不是那么漂亮。所以,这个问题主要是出于好奇。

有没有办法访问 Dictionary 的一个元素?从另一个?更一般地说,C# 是否有像 this 这样的关键字?这意味着“我在执行时现在里面的对象”,而不是“写入时包含的对象”?

编辑:最初,Dictionary是静态的,所以我提到的关于在初始化之前使用它的错误不会发生。 static实际上是粘贴更大的代码块并对其进行编辑,然后复制粘贴错误的剩余部分。

所以,发布的主要答案是关于有一个单独的对象来存储 Func然后将其添加到 Dictionary两次。这是有道理的,并且或多或少是我最终采用的方法(由于各种原因,它也使一些周围的代码更清晰一些)但它有点避免了我最感兴趣的问题部分,哪个是在 C# 中是否可以在运行时访问您所在的对象,以便对象可以访问它们当前所在的字典(或列表、数组等)。

最佳答案

这应该有效:

private static Dictionary<Option, Func<MyBaseClass>> OptionMapping 
= new Dictionary<Option, Func<MyBaseClass>> {
{ Option.Option1, () => new DerivedClassOne() },
{ Option.Option2, () => new DerivedClassTwo() },
{ Option.Option3, () => OptionMapping[Option.Option2]() }
};

Demo on ideone.

这种方法的问题在于 Option3 包含一个不同的 Func 对象,它依赖于另一个 Func每次调用它时都会产生它的输出。

我认为这不如显式创建共享 Func 对象并将其多次放入字典(即您的第二个代码片段或下面的替代方案)的解决方案好

private static Dictionary<Option, Func<MyBaseClass>> OptionMapping;
static MyClass() {
Func<MyBaseClass> makeDerivedTwo = () => new DerivedClassTwo();
OptionMapping = new Dictionary<Option, Func<MyBaseClass>> {
{ Option.Option1, () => new DerivedClassOne() },
{ Option.Option2, makeDerivedTwo },
{ Option.Option3, makeDerivedTwo }
};
}

关于c# - Dictionary<X, Func<Y>> 从其中的 Func<> 访问包含的 Dictionary,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21968088/

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