我使用此代码检查数据库中的行的值是否在边界内:
public int GetIntSetting(SET setting, int nullState)
{
var val = int.TryParse(GetStringSetting(setting, nullState.ToString()), out int parsed) ? parsed : nullState;
if (Enum.IsDefined(typeof(TH), val))
return val;
else
return nullState;
}
它的工作原理,但我想扩展这个,例如Enum的类型传递给函数。像这样的东西:
public int GetIntSetting(SET setting, int nullState, Enum enumType)
{
var val = int.TryParse(GetStringSetting(setting, nullState.ToString()), out int parsed) ? parsed : nullState;
// I need the following line to be able to use enumType instead of TH
if (Enum.IsDefined(typeof(TH), val))
return val;
else
return nullState;
}
这将被称为这些示例调用:
Settings.th = (TH)App.DB.GetIntSetting(SET.Th, 0, TH);
Settings.cfs = (LANG)App.DB.GetIntSetting(SET.Cfs, 0, LANG);
如何将参数TH传递给函数并让函数检查该值?
参数应该是“Type”类型,并且应该可以工作(如果您愿意,也可以为此方法提供泛型声明):
public int GetIntSetting(SET setting, int nullState, Type enumType)
{
var val = int.TryParse(GetStringSetting(setting, nullState.ToString()), out int parsed) ? parsed : nullState;
if (Enum.IsDefined(enumType, val))
return val;
else
return nullState;
}
用法是:
Settings.th = (TH)App.DB.GetIntSetting(SET.Th, 0, typeof(TH));
Settings.cfs = (LANG)App.DB.GetIntSetting(SET.Cfs, 0, typeof(LANG));
我会用泛型代替:
public T GetIntSetting<T>(string setting, int nullState) where T : System.Enum
{
var val = int.TryParse(GetStringSetting(setting, nullState.ToString()), out int parsed) ? parsed : nullState;
if (Enum.IsDefined(typeof(T), val))
return (T)val;
else
return (T)nullState;
}
在使用该功能时,不需要投射结果。并且由于存在通用枚举约束,因此不存在发送不是枚举的类型的风险
Settings.th = App.DB.GetIntSetting<TH>(SET.Th, 0);
Settings.cfs = App.DB.GetIntSetting<LANG>(SET.Cfs, 0);
在这个例子中,我创建了一个泛型函数,它可以采用任何枚举类型,如果值存在与否则返回一个布尔值。
public enum enumA : int
{
item1 = 0,
item2 = 1,
item3 = 2
}
public enum Day
{ Sun, Mon, Tue, Wed, Thu, Fri, Sat };
public class PassACustomDataTypeFController : Controller
{
public ActionResult Index()
{
bool b1 = CheckIfPresent<enumA>(5);
bool b2 = CheckIfPresent<Day>(5);
return View();
}
private bool CheckIfPresent<T>(object val) where T : struct, IConvertible
{
if (!typeof(T).IsEnum)
{
throw new ArgumentException("Wrong argument");
}
var expr = Expression.Call(typeof(Enum).GetMethod("IsDefined", new Type[] { typeof(Type), typeof(object) }),
Expression.Constant(typeof(T)),
Expression.Convert(Expression.Constant(val),
typeof(object)
)
);
var retVal = Expression.Lambda<Func<bool>>(expr).Compile()();
return retVal;
}
}