我有以下代码,其中ApplicationType是枚举。我在许多其他枚举上有相同的重复代码(除参数类型之外的所有内容)。什么是整合此代码的最佳方法?
private static string GetSelected(ApplicationType type_, ApplicationType checkedType_)
{
if (type_ == checkedType_)
{
return " selected ";
}
else
{
return "";
}
}
答案 0 :(得分:2)
从臀部拍摄,有点像......
private static string GetSelected<T>(T type_, T checkedType_) where T : System.Enum{
//As before
}
显然这是非法的。
为了简单地减少重复,你可以直接用Enum替换T,
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
}
上面将确保你只传递相同类型的枚举(如果传入两个不同的枚举,你会得到一个类型推断错误)但是当满足T约束的非枚举传递时会编译。 / p>
不幸的是,这个问题似乎没有一个很好的解决方案。
答案 1 :(得分:0)
在编译时通过通用约束很难做到这一点,因为enum
实际上是int
。您需要在运行时限制值。
答案 2 :(得分:0)
对于enum的平等?简化:
public static string GetSelected<T>(T x, T y) {
return EqualityComparer<T>.Default.Equals(x,y) ? " selected " : "";
}
你可以将where T : struct
添加到第一行,但 没有这样做。
有关演示的完整示例:
using System;
using System.Collections.Generic;
static class Program {
static void Main() {
ApplicationType value = ApplicationType.B;
Console.WriteLine("A: " + GetSelected(value, ApplicationType.A));
Console.WriteLine("B: " + GetSelected(value, ApplicationType.B));
Console.WriteLine("C: " + GetSelected(value, ApplicationType.C));
}
private static string GetSelected<T>(T x, T y) {
return EqualityComparer<T>.Default.Equals(x, y) ? " selected " : "";
}
enum ApplicationType { A, B, C }
}
答案 3 :(得分:0)
这是否适合您的需要?
private static string GetSelected<T>(T type_, T checkedType_)
where T: struct
{
if(type_.Equals(checkedType_))
return " selected ";
return "";
}