我刚刚发现System.Enum不易实现为通用类型。当比较两个T
类型的枚举时,编译器会抛出错误:
if(button.Identifier == Identifier) // (in AbstractInputDevice)
我认为我不能比较这两个枚举类型,因为它们实际上并不被认为是枚举类型。因此没有可用的比较方法。如何将它们进行相等比较?
以下是更多细节:
public class Button<TEnum> where TEnum : struct, IConvertible, IComparable, IFormattable {
public TEnum Identifier {
get;
private set; //Set in the ctor
}
}
并且
public abstract class AbstractInputDevice<TEnum> where TEnum : struct, IConvertible, IComparable, IFormattable {
private List<Button<TEnum>> _buttons = new List<Button<TEnum>>();
public Button<TEnum> GetButton(TEnum Identifier){
foreach(Button<TEnum> button in _buttons){
if(button.Identifier == Identifier) //<- compiler throws
return button;
}
Debug.Log("'" + GetType().Name + "' cannot return an <b>unregistered</b> '" + typeof(Button<TEnum>).Name + "' that listens to '" + typeof(TEnum).Name + "." + Identifier.ToString() + "'.");
return null;
}
}
一个InputDevice可能看起来像这样:
public class Keyboard : AbstractInputDevice<KeyCode> {
private void Useless(){
Button<KeyCode> = GetButton(KeyCode.A);
}
}
我用了这个资源:
创建泛型方法并将T约束为枚举类型。
button.Identifier.Equals(Identifier)
,为了让代码更简洁:var button = _buttons.Where(b => b.Identifier.Equals(Identifier)).FirstOrDefault();
。 - Alex