簡體   English   中英

c#,從抽象工廠類獲取泛型類型屬性

[英]c# ,Get Generic Type Property from Abstract Factory Classes

我正在實現抽象工廠模式以創建動態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取回它的方法。

您需要為此創建公共屬性。 由於無法使用任何類的對象訪問私有變量。

我想, 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;
     }

}

就像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; }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM