【发布时间】:2014-10-04 18:37:33
【问题描述】:
请参阅下面的解决方案 - 搜索 UPDATE。
我有一个广泛的状态机架构,我通过为每个状态创建一个类来实现它(有多个机器,但所有的状态都继承自同一个“MachineState”类)。每个状态都有一个静态属性“StateName”:
public class SomeState: MachineState
{
// THIS BLOCK SHOULD BE COPIED TO ALL STATE CLASSES!!
private static string _StateName;
public static string StateName
{
get {
if (_StateName == null)
{
_StateName = MethodBase
.GetCurrentMethod()
.DeclaringType
.ToString()
.Split(new char[] { '.' })
.ToList()
.Last();
}
return _StateName;
}
}
// END OF BLOCK
public SomeState(Queue<string> messages) //
: base(messages)
{
...
}
...
}
呃。
至少我会调用处理器密集型的东西,以便每个类只获得一次名称——就我的目的而言,这是可以接受的成本。但我真的很想为他们找到某种方式来“继承”这段代码——或者至少是某种方式让他们将它包含在宏之类的东西中。我有一个抽象属性,所以如果它没有实现,我会在编译时捕获它;但是,仍然必须有一种方法可以避免将这种混乱复制到每个班级中——然后如果需要,必须在每个班级中更改它。
有什么想法吗?
谢谢。
------------ 更新 ---------------------- -----
生活充满了妥协;这个我可以忍受。 @Tallek 在基类中提出了这个建议:
public static string GetStateName<T>() where T : MachineState
{
return typeof(T).Name;
}
我将它与我的静态属性集成,如下所示(对于“SomeState”类):
// THIS BLOCK SHOULD BE COPIED TO ALL STATE CLASSES!!
public static string StateName { get { return GetStateName<SomeState>(); } }
它并不完美;我必须确保在每个类的 GetStateName 调用中获得正确的州名。但它做了两件我急于做的事情:将逻辑移动到一个位置,并且更易于阅读。保持 StateName 抽象将帮助我捕获任何尚未实现 StateName 的状态。
再次感谢大家。
【问题讨论】:
-
必须是
static吗?如果不是,那么它将被继承。 -
是的;我试图避免使用庞大的枚举或数以千计的 const 字符串来识别状态名称,所以我希望每个状态都是可识别的(作为字符串......这是必要的)。所以我希望能够访问这样的状态: if(stateName == SomeState.StateName) { }
-
public string StateName { get { return GetType().Name; } }? -
然后显示您访问此属性的代码,我不清楚您要如何处理此属性值。你可能想反过来做,使用工厂和开关或字典,比如
case "SomeState": return new SomeState();。 -
可以在基类上做一个静态方法,GetStateName
() where T : MachineState and return typeof(T).Name;
标签: c# class inheritance macros types