![](/img/trans.png)
[英]c# Get if property type inherits from one abstract generic class with reflection
[英]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.