有没有办法在C#中强制在子类中存在静态成员?

对于基于图块的游戏,我使用不同的类来描述不同图块类型的行为.它们(显然)来自基类.现在我遇到了一个问题,有时我需要弄清楚玩家是否有足够的资金来支付升级到某种磁贴类型的费用.

由于平铺类型的成本始终保持不变,因此将其设置为静态似乎是有意义的.不幸的是,C#似乎不允许使用抽象类或接口来强制在子类中存在这样的静态字段.

我的“解决方案”是使用反射获取这些数据,但在我看来相当丑陋且有潜在危险,因为我可能会忘记其中一个子类中的静态字段,这会导致整个事情……

以下代码片段是我目前拥有的代码片段; AllowedUpdates是List< System.Type>包含可以升级到磁贴的类型.

foreach (Type t in AllowedUpdates) {

    // Get the Action Point Cost
    FieldInfo fi = t.GetField ("actionPointCost", BindingFlags.NonPublic | BindingFlags.Static);
    int cost = (int)fi.GetValue (null);

    // Check for any requirements
    bool requirementsFulfilled;
    try {
        // Get the static method that checks the necessary requirements.
        MethodInfo mi = t.GetMethod ("CheckRequirements", new Type[] { typeof(Dictionary<string, ProtoObject>) });
        object[] arguments = { neighbourFields };

        // Invoke this method
        object returnValue = mi.Invoke (null, arguments);
        requirementsFulfilled = (bool)returnValue;
    } catch (ArgumentNullException) {
        // This type has no special requirements, pass it.
        requirementsFulfilled = true;
    } catch (NullReferenceException) {
        // No requirements needed, pass it.
        requirementsFulfilled = true;
    }
}

必须有更好的方法来做到这一点.我忽略了一种设计模式吗?

最佳答案
您无法通过抽象基类或接口强制在任何派生类上存在静态成员.

反思不是你最好的选择.在这种情况下,重新考虑静态类的用法.您可能会将tile类型的开销视为抽象只读属性.派生类将被强制实现该属性.

public abstract int ActionPointCost { get; }

转载注明原文:有没有办法在C#中强制在子类中存在静态成员? - 代码日志