c#,从抽象工厂类获取通用类型属性

时间:2017-08-17 08:36:45

标签: c# design-patterns factory-pattern abstract-factory

我正在实现抽象工厂模式以创建动态Matrix DataTable。这个想法是在工厂类上创建不同的生成器实例。但是,在结构的最后,我希望获得最终结果作为将暴露给MVC视图的对象。问题是我无法想出一种提取输出的方法,因为生成器实例具有泛型属性。我的代码是这样的:

枚举和通用类

public enum GeneratorType
    {
        GenericBudgetGenerator = 1
    }


public class GenericMatrix<T>
{
    public List<string> MatrixHeaders { set; get; }
    public List<T> MatrixRow { set; get; }
    public T MatrixFooterRow { set; get; }
}

public class GenericItemRow
    {
        public string EntityName { set; get; }
        public List<double> Values { set; get; }
        public double Total { set; get; }

    }

生成器和接口

public interface IGenerator
    {
        void Build();
    }

public interface IMatrixGenerator<TRow>
        : IGenerator
    {
        IEnumerable<TRow> CreateCellValues();
    }

public class MatrixGeneratorFactory
{
    public static IGenerator Create(Enum _type)
    {
        switch (_type)
        {
            case GeneratorType.GenericGenerator :
                return new GenericGenerator ();
            default:
                throw new ArgumentException("No generator exist");
        }
    }
}

public class MatrixGeneratorBase
{         
            public void BuildMatrixTemplate()
        {
              //some logic
         }

}

public class GenericGenerator : MatrixGeneratorBase, IMatrixGenerator<GenericItemRow>
{

        public IEnumerable<GenericItemRow> CreateCellValues()
        {
              //some logic here
         }

        public void Build()
        {
             BuildMatrixTemplate();

             GenericMatrix<GenericBudgetValueMatrixRow> _genericMatrix = new GenericMatrix<GenericBudgetValueMatrixRow>();

              _genericMatrix = //Some logic here
         }

}

客户代码

 class Program
 {
    static void Main(string[] args)
    {
       IGenerator generator = MatrixGeneratorFactory.Create(GeneratorType.GenericGenerator );
       generator.Build();

     //How can i get the _genericMatrix out from the generator instance

     }
 }

由于_genericMatrix是GenericGenerator中的强类型属性,我无法找到使用IGenerator检索它的方法。

3 个答案:

答案 0 :(得分:0)

您需要为此创建公共属性。因为没有办法可以使用任何类的对象访问私有变量。

答案 1 :(得分:0)

我想,Build应该返回创建的矩阵,因此它变为

public interface IGenerator
{
    object Build();
}

public class GenericGenerator : MatrixGeneratorBase, IMatrixGenerator<GenericItemRow>
{
    public object Build()
    {
         BuildMatrixTemplate();

         var genericMatrix = new GenericMatrix<GenericBudgetValueMatrixRow>();

         genericMatrix = //Some logic here

         return genericMatrix;
     }

}

答案 2 :(得分:0)

像Haukinger所说:返回genericMatrix将是最简单的方法,但我也会定义Generator泛型,因为你会想要构建不同的矩阵。 所以你可以这样做:

public interface IGenerator
{
    IMatrix Build();
}

public class GenericGenerator<TRow> : MatrixGeneratorBase, 
IMatrixGenerator<GenericItemRow> where TRow : GenericItemRow
{

        public IEnumerable<GenericItemRow> CreateCellValues()
    {
          //some logic here
    }

    public IMatrix Build()
    {
         BuildMatrixTemplate();

         GenericMatrix<TRow> _genericMatrix = new 
         GenericMatrix<TRow>();

          _genericMatrix = //Some logic here
          return _genericMatrix;

     }

}

public interface IMatrix
{
  //Properties that you need to use.
}

public class GenericMatrix<T> : IMatrix  where T : GenericItemRow
{
    public List<string> MatrixHeaders { set; get; }
    public List<T> MatrixRow { set; get; }
    public T MatrixFooterRow { set; get; }
}