我正在实现抽象工厂模式以创建动态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检索它的方法。
答案 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; }
}