如何确保方法只接收特定的值
本文关键字:方法 何确保 确保 | 更新日期: 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"
}
- 我们确保开发人员只能插入预先定义的字符串
var list=_repositorySensors.Select(传感器类型。热传感器);
- 在存储库中,我们可以获得实际的字符串
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/
到目前为止我找到的最好的答案。键入安全枚举模式。只是我不知道它是这样叫的。
我发布这篇文章是为了将来寻找答案的人。
干杯,伙计们!