如何创建一个函数,当传递一种类型的枚举时,检查变量的值是否在该枚举范围内?

问题描述 投票:0回答:3

我使用此代码检查数据库中的行的值是否在边界内:

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传递给函数并让函数检查该值?

c#
3个回答
4
投票

参数应该是“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)); 

3
投票

我会用泛型代替:

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); 

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;
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.