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

时间:2018-03-08 13:22:08

标签: c#

我有一堆实现接口的数据类,我们称之为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中发生的事件,具体取决于&#39 ; s实施ISpendable

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

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

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

我看来,我需要定义.moneyBank类中的Money引用,以及.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;

但这并不比原来的天真方法好得多。

有什么建议/想法吗?

1 个答案:

答案 0 :(得分:1)

根据@Oxald的建议,我重构了一些事情以解决这个问题。

关键是只需将以下方法添加到ISpendable接口,但是:

IBank GetRelatedBank(Location location);

这样Time可以返回本地TimeBank,Money可以返回本地MoneyBank等。

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

public class MoneyBank : IBank<Money> {}

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