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

切尔齐

我有一堆实现接口的数据类,我们称它为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;

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

我需要的话,它的出现,是定义.moneyBank里面引用Money类,而.timeBank内部参考Time类,这样我可以做这样的事情:

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

看来我可以使用Invoke来实现类似的功能,但据我所知,这涉及使用字符串解析,随着代码库规模的增加,字符串解析似乎很杂乱且可能存在问题。

也许我应该以更简单的方式去?例如,将分别存储typeof(MoneyBank)Moneytypeof(TimeBank)Time,然后路由到例如Location-内的正确银行

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

但这并不比原始的幼稚方法好多了。

有什么建议/想法吗?

切尔齐

遵循@Oxald的建议,我将内容进行了一些重构以解决此问题。

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

IBank GetRelatedBank(Location location);

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

通过让所有可以购买的对象都实现一个IPurchasable接口,我可以解决在TimeBank上花钱的问题,该接口可以确保该对象的每个ISpendable(成本)都调用正确的银行以实际执行花费。可以通过更改IBank接口以接受其中T为ISpendable的类型T,然后在每个银行中显式声明接受的类型来加强这一点,例如

public class MoneyBank : IBank<Money> {}

但是尚未测试以确保此功能有效。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

csharp中emgucv的全局阈值

CSharp中的JavaScript“打包”功能

CSharp 和 javascript 中的 FromXmlString

将函数从 csharp 转换为 vb

将XML序列化为CSharp类

CSharp将.cs类转换为.dll

csharp中的单元测试异步任务

Microsoft.CSharp库中的BadImageFormat异常

在 csharp 中获取枚举值的特定范围

在Assembly-CSharp-Editor中工作时,无Intellisense for Unity Assembly-CSharp脚本

Json 到 csharp 类无法反序列化对象

'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException''对象'不包含'intEmployeeId'的定义

如何将 javascript + jquery 转换为 unity csharp?

什么是.NET 4.0中的Microsoft.csharp.dll

如何在 CSharp 中制作自己的许可证密钥

同一对象上的多个纹理opengl4csharp

ASP.NET MVC 中的另一个 [Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'Cannot perform runtime binding on a null reference']

如何存储返回列表,以便可以在另一个类中使用它?

在私有类型上动态抛出 Microsoft.CSharp.RuntimeBinder.RuntimeBinderException

如何设置字段的值,以便可以从另一个类调用它?

jQuery动态将变量添加到另一个变量名

如何通过javascript将json数据推送到csharp对象列表?

CSharp脚本编写,是否可以从使用csi.exe运行的脚本中返回值?

将对象传递给MongoDb csharp驱动程序中的Query.EQ

CSharp CRUD 系统将数据库中的数据显示到消息框中

在PHP中具有3个参数的hash_hmac,等效的csharp,javascript

如何将 API 请求中的数据设置为变量,以便我可以在另一个 API 调用中使用它?

如何从XAMLl视图将值传递给Csharp Wpf Application中的方法?

像javascript一样在csharp中拆分字符串