Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否存在用于访问IEnumerable中的具体类型的设计模式<;IFoo>;?_C#_Design Patterns_Builder_Factory Pattern - Fatal编程技术网

C# 是否存在用于访问IEnumerable中的具体类型的设计模式<;IFoo>;?

C# 是否存在用于访问IEnumerable中的具体类型的设计模式<;IFoo>;?,c#,design-patterns,builder,factory-pattern,C#,Design Patterns,Builder,Factory Pattern,我正在尝试将创建模式应用于以下业务领域。我不确定这是否是正确的解决方案,但我一直在研究factory和builder模式,但我可能试图应用错误的模式。以下是以下域: 技术规格 视觉规格 视野(字符串) 分辨率(字符串) 音频规格 频率范围(字符串) 麦克风(布尔值) 上面我有一个技术规范的业务对象,我只是展示了两个的示例,但它们最多可以是N个对象。这对于技术规范的属性是正确的,每个规范最多可以有N个属性 如果我想返回技术规范的属性,那么尝试使用上面提到的模式以抽象的方式编写代码时

我正在尝试将创建模式应用于以下业务领域。我不确定这是否是正确的解决方案,但我一直在研究factory和builder模式,但我可能试图应用错误的模式。以下是以下域:

  • 技术规格
    • 视觉规格
      • 视野(字符串)
      • 分辨率(字符串)
    • 音频规格
      • 频率范围(字符串)
      • 麦克风(布尔值)
上面我有一个技术规范的业务对象,我只是展示了两个的示例,但它们最多可以是N个对象。这对于技术规范的属性是正确的,每个规范最多可以有N个属性

如果我想返回技术规范的属性,那么尝试使用上面提到的模式以抽象的方式编写代码时遇到了障碍。我被迫投下他们,任何关于模式的建议,将适用于这种情况

下面是我正在尝试做的一些代码示例,请参见下面。在main函数中,我可以构建我的规范对象,但是如果我想访问规范对象的具体属性而不进行强制转换的话。我希望这能澄清一些事情

主要功能:

    class Program
    {
        static void Main(string[] args)
        {
            TechnicalSpecificationBuilder visual = new VisualSpecificationBuilder();
            TechnicalSpecificationBuilder audio = new AuditorySpecificationBuilder();

            //TODO, how do I get acces to properties without Casting?
            Specification visualSpec = visual.CreateSpecification();
            Specification audiotSpec = audio.CreateSpecification();            
        }
    }
抽象技术规范生成器:

public abstract class TechnicalSpecificationBuilder
    {

        public Specification CreateSpecification()
        {
            return BuildSpecification();
        }

        protected abstract Specification BuildSpecification();       
    }
 public class VisualSpecificationBuilder : TechnicalSpecificationBuilder
    {      
        protected override Specification BuildSpecification()
        {
            // TODO: Implement this method
            return new VisualSpecification();
        }
    }
可视化技术规范生成器:

public abstract class TechnicalSpecificationBuilder
    {

        public Specification CreateSpecification()
        {
            return BuildSpecification();
        }

        protected abstract Specification BuildSpecification();       
    }
 public class VisualSpecificationBuilder : TechnicalSpecificationBuilder
    {      
        protected override Specification BuildSpecification()
        {
            // TODO: Implement this method
            return new VisualSpecification();
        }
    }
摘要规范:

public abstract class Specification
    {

    }
public class VisualSpecification : Specification
    {
        public string FieldOfView { get; set; }
        public bool IsBinocularVisionCapable { get; set; }
        public bool IsHeadTrackingCapable { get; set; }
        public bool IsEyeTrackingCapable { get; set; }
        public string Resolution { get; set; }       
    }
视觉规格:

public abstract class Specification
    {

    }
public class VisualSpecification : Specification
    {
        public string FieldOfView { get; set; }
        public bool IsBinocularVisionCapable { get; set; }
        public bool IsHeadTrackingCapable { get; set; }
        public bool IsEyeTrackingCapable { get; set; }
        public string Resolution { get; set; }       
    }

下面应该做到这一点-为生成器类使用一个通用基类,并使具体规范子类成为一个类型参数

public abstract class TechnicalSpecificationBuilder<TSpecification>
   where TSpecification : Specification
{
   public TSpecification CreateSpecification()
   {
      return this.BuildSpecification();
   }

   protected abstract TSpecification BuildSpecification();       
}

public class VisualSpecificationBuilder : TechnicalSpecificationBuilder<VisualSpecification>
{      
   protected override VisualSpecification BuildSpecification()
   {
      return new VisualSpecification();
   }
}
公共抽象类技术规范生成器
其中t规格:规格
{
公共TSSpecification CreateSpecification()
{
返回此.BuildSpecification();
}
受保护的抽象TSSpecification BuildSpecification();
}
公共类VisualSSpecificationBuilder:TechnicalSpecificationBuilder
{      
受保护的重写VisualSSpecification BuildSpecification()
{
返回新的VisualSSpecification();
}
}

我还建议您考虑使用接口
isspecification
,或者与基类一起使用
Specification
——如果由于任何原因无法从基类派生具体的规范类,这可能会有所帮助。

除非使用
dynamic
。你能解释一下如何使用dynamic吗?@user1329436我试着澄清一下你的标题,它是否说明了你的意思?是的,它说明了。谢谢