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

C# CSharp-将变量名存储在另一个变量中,以便可以在给定对象上动态调用它,c#,C#,我有一组实现接口的数据类,我们称之为ISpendable。根据运行时处理的是哪个ISpendable类,控制器类需要设置不同的事件侦听器 例如: public class Money : ISpendable {} public class Time : ISpendable {} public class Location { public MoneyBank moneyBank; public TimeBank timeBank; } public class MoneyBank : I

我有一组实现接口的数据类,我们称之为
ISpendable
。根据运行时处理的是哪个
ISpendable
类,控制器类需要设置不同的事件侦听器

例如:

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
引用,在
Time
类中定义
.timeBank
引用,这样我就可以执行以下操作:

location.<cost.DynamicallyStoredBankType>.AmountChanged += OnAmountChanged
但这并不比最初的天真方法好多少


有什么建议/想法吗?

根据@Oxald的建议,我对一些东西进行了重构,以解决这个问题

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

IBank GetRelatedBank(Location location);
这样,时间可以返回本地时间银行,金钱可以返回本地货币银行,等等

通过让所有可以购买的对象都实现一个iPourchasable接口,我稍微解决了在TimeBank上花钱的问题,该接口确保该对象的每个ISpendable(cost)都调用正确的银行来实际执行花钱。通过更改IBank接口以接受类型T,其中T:ISpendable,然后在每个银行中显式地声明接受的类型,例如

public class MoneyBank : IBank<Money> {}
public class MoneyBank:IBank{}

但是还没有进行测试以确保其正常工作。

为什么不简单地将
AmountChanged
事件添加到界面中?然后您可以将所有内容订阅到同一个事件处理程序,如果需要,可以检查事件处理程序本身中的
发送方
的实际类型。我猜主要是因为可能存在大量的
ISpendable
实例,所以我不想让他们都听每个IBank的所有
AmountChanged
事件-我最好只订阅每个相关事件。除非我误解了你的评论?不,你没有误解我。你有可能改变你的课堂设计吗?因为MoneyBank和Money之间存在着一种非设计的紧密联系:您的设计允许您执行location.MoneyBank.Spend(Time),但它似乎不适合仍处于概念阶段的业务逻辑(顺便说一句,它可能违反了Solid的LSP),因此根本不致力于此设计。制作ISpendable接口背后的原因是,有些对象在时间和金钱上都有成本(以及可能定义的任何其他成本),我希望能够将所有这些“成本”合并到一个单一类型(ISpendable),而不必处理大量并行列表等。
public class MoneyBank : IBank<Money> {}