gpt4 book ai didi

c# - CSharp - 将变量名称存储在另一个变量中,以便可以在给定对象上动态调用它

转载 作者:太空宇宙 更新时间:2023-11-03 12:17:15 24 4
gpt4 key购买 nike

我有一堆实现接口(interface)的数据类,我们称它为ISpendable。根据在运行时处理哪个 ISpendable 类, Controller 类需要设置不同的事件监听器。

例子:

public class Money : ISpendable {}
public class Time : ISpendable {}

public class Location { public MoneyBank moneyBank; public TimeBank timeBank; }

public class MoneyBank : IBank{
//...
public void Spend(ISpendable money);
}
public class TimeBank L IBank {
//...
public void Spend(ISpendable time);
}

public class CostDisplay() {
public CostDisplay(Location location, ISpendable cost) {}
}

现在我想做的是,在 CostDisplay() 中订阅发生在特定 TimeBank 和/或 MoneyBank 中的事件>,取决于实现 ISpendable 的类。

所以一个天真的方法可能是:

if(cost is Money) location.moneyBank.AmountChanged += OnAmountChanged;
else if (cost is Time) location.timeBank.AmountChanged += OnAmountChanged;

但我宁愿避免这种设置,因为我可能想添加更多类型的 ISpendables。

看来,我需要的是在 Money 类中定义 .moneyBank 引用,并在其中定义 .timeBank 引用Time 类,这样我就可以做这样的事情:

location.<cost.DynamicallyStoredBankType>.AmountChanged += OnAmountChanged

看起来我可以使用 Invoke 来实现这样的事情,但据我所知,这涉及使用字符串解析,这看起来很困惑,并且随着代码库规模的增长可能会出现问题。

也许我应该采用更简单的方法?比如将typeof(MoneyBank)存入Money,将typeof(TimeBank)存入Time,然后路由到正确的银行,例如 Location -

if (type is typeof(TimeBank)) return timeBank;
if (type if typeof(MoneyBank)) return moneyBank;

但这并不比最初的幼稚方法好多少。

有什么建议/想法吗?

最佳答案

根据@Oxald 的建议,我重构了一些东西来解决这个问题。

但是,关键是简单地将以下方法添加到 ISpendable 接口(interface):

IBank GetRelatedBank(Location location);

比如Time可以返回本地TimeBank,Money可以返回本地MoneyBank等

通过让所有可购买的对象实现一个 IPurchasable 接口(interface),我已经稍微解决了能够在 TimeBank 花钱的问题,这确保了该对象的每个 ISpendable(成本)调用正确的银行以实际执行支出。可能可以通过更改 IBank 接口(interface)以接受类型 T 来加强这一点,其中 T:ISpendable,然后在每个银行中明确说明接受的类型,例如

public class MoneyBank : IBank<Money> {}

但尚未进行测试以确保其有效。

关于c# - CSharp - 将变量名称存储在另一个变量中,以便可以在给定对象上动态调用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49174130/

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