如何确保方法只接收特定的值

本文关键字:方法 何确保 确保 | 更新日期: 2023-09-27 18:28:09

也许这是一个微不足道的问题,但我真的不知道解决这个问题的最佳方法是什么。

我的数据库中有一个表,其中的列描述了传感器。

现在有一个专栏介绍了不同类型的传感器:-热量传感器-压力传感器等等在这里使用字符串很好,因为数字并不能真正告诉你什么。

现在,为了从数据库中检索数据,我使用了一个存储库。

public IEnumerable<Sensor> Select(string typeOfSensor)
{
    using (ISession session = NHibernateHelper.OpenSession())
    {
        return session.Query<Sensor>()
            .Where(c =>c.TypeOfSensor == typeOfSensor);
    }
}

如何确保用户插入正确的传感器名称?

我想避免在代码中使用魔术串。

首先我考虑使用enum,但它不能存储字符串。关于带有静态常量的静态类,但这些并不能真正让开发人员使用它们,因为类型是相同的(字符串),没有什么可以阻止您不使用预定义的类型。

我们怎么能做这样的事情(如果enum可以存储字符串)?

enum TypeOfSensor  //i know this is not possible but it's for example purposes
{
    HeatSensor= "Heat sensor",
    PressureSensor = "Pressure sensor"
}
  1. 我们确保开发人员只能插入预先定义的字符串

var list=_repositorySensors.Select(传感器类型。热传感器);

  1. 在存储库中,我们可以获得实际的字符串
public IEnumerable<Sensor> Select(TypeOfSensor typeOfSensor)
{
  using (ISession session = NHibernateHelper.OpenSession())
  {
      return session.Query<Sensor>()
          .Where(c =>c.TypeOfSensor == typeOfSensor.Value);
  }
}

如何确保方法只接收特定的值

如果它需要是一个字符串,可以在枚举中使用DescriptionAttribute,为每个枚举值定义一个自定义字符串。

然后可以通过反射(例如作为扩展方法)来获得该描述值。

enum TypeOfSensor 
{
    [Description("Heat sensor")]
    HeatSensor,
    [Description("Pressure sensor")]
    PressureSensor
}
private static string ToDescription(this Enum value)
{
    var fi = value.GetType().GetField(value.ToString());
    var attributes =
        (DescriptionAttribute[])fi.GetCustomAttributes(
        typeof(DescriptionAttribute),
        false);
    return attributes.Length > 0 ? attributes[0].Description : value.ToString();
}

public IEnumerable<Sensor> Select(TypeOfSensor typeOfSensor)
{
    using (ISession session = NHibernateHelper.OpenSession())
    {
      var sensorType = typeOfSensor.ToDescription();
      return session.Query<Sensor>()
          .Where(c =>c.TypeOfSensor == sensorType );
    }
}

如果你有一个简单的例子,你只需要将一个精确的string映射到你现有的enum,你可以很容易地做这样的事情:

readonly Dictionary<string, TypeOfSensor> SensorTypes =
    new Dictionary<string, TypeOfSensor>
        {
            {"Heat sensor", TypeOfSensor.HeatSensor},
            {"Pressure sensor", TypeOfSensor.PressureSensor}
        };

现在,您可以使用SensorTypes.ContainsKey("Heat sensor")轻松地验证您的输入,并且可以适当地处理有问题的数据库值。

您可以使用类似下面的内容来代替enum:

abstract class TypeOfSensor
{
    public static readonly TypeOfSensor HeatSensor = 
        new HeatTypeOfSensor();
    public static readonly TypeOfSensor PressureSensor =
        new PressureTypeOfSensor();
    private TypeOfSensor() { }
    protected abstract string Name { get; }
    public static implicit operator string(TypeOfSensor s)
    {
        return s.Name;
    }
    private class HeatTypeOfSensor : TypeOfSensor
    {
        protected override string Name
        {
            get { return "Heat Sensor"; }
        }
    }
    private class PressureTypeOfSensor : TypeOfSensor
    {
        protected override string Name
        {
            get { return "Pressure Sensor"; }
        }
    }
}

然后:

public IEnumerable<Sensor> Select(TypeOfSensor typeOfSensor)
{
    using (ISession session = NHibernateHelper.OpenSession())
    {
        return session.Query<Sensor>()
            .Where(c => c.TypeOfSensor == typeOfSensor);
    }
}

一段时间过去了,但这正是我想要的:

http://blog.falafel.com/introducing-type-safe-enum-pattern/

到目前为止我找到的最好的答案。键入安全枚举模式。只是我不知道它是这样叫的。

我发布这篇文章是为了将来寻找答案的人。

干杯,伙计们!