Съемка с бедра, что-то вроде ...
private static string GetSelected<T>(T type_, T checkedType_) where T : System.Enum{
//As before
}
Видимо, это незаконно.
Чтобы просто сократить повторение, вы можете просто заменить T на Enum таким образом,
private static String GetSelected(Enum type_, Enum checkedType_){
if(type_.CompareTo(_checkedType) == 0) return "selected";
return "";
}
Хотя это не сильно влияет на безопасность типов, так как в него могут быть переданы два разных типа перечисления.
Вместо этого вы можете потерпеть неудачу во время выполнения:
private static String GetSelected(Enum type_, Enum checkedType_){
if(type_.GetType() != checkedType.GetType()) throw new Exception();
//As above
}
Чтобы обеспечить некоторую безопасность во время компиляции, вы можете использовать общее ограничение, хотя, поскольку вы не можете использовать класс Enum, вы не сможете ограничить все:
private static String GetSelected<T>(T type_, T checkedType_) where T : IComparable, IFormattable, IConvertible{
if(!(first is Enum)) throw new Exception();
//As above
}
Вышеприведенное гарантирует, что вы передадите только Enums одного и того же типа (вы получите ошибку вывода типа, если вы передадите два разных Enums), но скомпилирует, когда будут переданы не-Enum, которые удовлетворяют ограничениям на T.
К сожалению, похоже, что нет отличного решения этой проблемы.