C#中运行时的不同类型实例化

时间:2017-11-07 10:39:20

标签: c# inheritance polymorphism instantiation factory-pattern

我必须解决每个传感器类型需要不同计算的问题(我需要决定在运行时实例化哪种类型)。 让我以一个例子告诉你:

1。从数据库表中我得到了这个结果:

SensorType RawValue ADCGain R0Value I0Value ABCValue 
1          100      0.1     NULL    NULL    NULL
1          150      0.2     NULL    NULL    NULL
2          30       NULL    1       2       2
2          15       NULL    5       5       6 

假设传感器类型1是具体类型 AISensor ,并且来自基类的类型和类型2是 Pt100Tempsensor 并且来自同一基类的inhertis。 这是C#中的类定义:

 public abstract class Sensor
     {
        public abstract int Id { get;  set; }
        public abstract string Code { get;  set; }
        public abstract string Name { get;  set; }

        public abstract double GetCalculatedValue(int rawValue);
    }

   public class Pt100Tempsensor : Sensor
    {

        public int R0Value { get; set; }
        public int I0value { get; set; }
        public int ABCValue { get; set; }
        public override int Id { get; set; }
        public override string Code { get; set; }
        public override string Name { get; set; }

        public override double GetCalculatedValue(int rawValue)
        {
            return ((R0Value * I0value) / ABCValue) * rawValue;
        }
    }

public class AISensor : Sensor
{
    public int AdcGain { get; set; }
    public override int Id { get; set; }
    public override string Code { get; set; }
    public override string Name { get; set; }

    public override double GetCalculatedValue(int rawValue)
    {
        return rawValue * AdcGain;
    }
}

现在我想知道在运行时实例化对象的最佳方法是什么,如果我添加新的传感器类型,我不需要更改现有代码(如简单的工厂方法"模式"。)

感谢您的帮助。

4 个答案:

答案 0 :(得分:0)

使用根据传感器类型ID

创建具体传感器的工厂

答案 1 :(得分:0)

最简单的方法是使用基于ID的开关的工厂方法,根据ID号制作不同的传感器。

如果您希望能够在不更改任何其他代码的情况下添加传感器(即无需更改工厂方法),则需要使用反射来(1)发现所有可用的传感器类型,以及(2)构建正确的传感器类型它的ID。你可以这样用一个属性,例如:

[Sensor(42)]
public class Pt100Tempsensor : Sensor
{
    ....

其中42是ID

但说实话,如果您真的需要大量的传感器类型,那么这样做是值得的。

答案 2 :(得分:0)

我提出了一个简单工厂模式的建议。

但是:如果你真的需要添加新传感器而不涉及现有代码,我只能想到一个"插件系统"。这意味着:

  • 你有一个共同的界面。
  • 您可以使用某种配置将ID映射到实现。
  • 您有一个可以检测实现并根据上述配置创建实例的工厂。

供参考:Microsoft有一些示例代码。见https://code.msdn.microsoft.com/windowsdesktop/Creating-a-simple-plugin-b6174b62

答案 3 :(得分:0)

您可以使用ORM(实体框架,NHibernate)来实现此目标。创建新的Sensor类时,必须修改代码,但仅限于数据库映射部分。

该表看起来像一个具有TPH映射策略的表,其中SensorType是鉴别器列。