C#工厂问题

C#工厂问题,c#,design-patterns,factory-pattern,C#,Design Patterns,Factory Pattern,考虑下面的工厂方法,它获取一些元数据并创建一个相关类型的列 这一切都很好,直到我遇到一个依赖于一些额外数据的列(ColumnType.DropDownList)。这需要一些额外的数据(值列表)用于显示目的 我不想在元数据级别提供这些数据,因此在工厂中创建对象时提供这些数据似乎是明智的。但我正在努力寻找一种优雅的方法将列表放入工厂方法(请参见备注:此处不能硬编码!!!) 有什么想法吗?我对任何人都开放 public static DetailEditorColumn<int>

考虑下面的工厂方法,它获取一些元数据并创建一个相关类型的列

这一切都很好,直到我遇到一个依赖于一些额外数据的列(ColumnType.DropDownList)。这需要一些额外的数据(值列表)用于显示目的

我不想在元数据级别提供这些数据,因此在工厂中创建对象时提供这些数据似乎是明智的。但我正在努力寻找一种优雅的方法将列表放入工厂方法(请参见备注:此处不能硬编码!!!)

有什么想法吗?我对任何人都开放

     public static DetailEditorColumn<int> Create(ColumnMetaData metaData)
    {
        if (metaData.ColumnType == ColumnType.Rank)
        {
            return GridColumnBuilder<int>.GetRankColumn(metaData.DisplayOrder, metaData);
        }

        if (metaData.ColumnType == ColumnType.Decision)
        {
            return GridColumnBuilder<int>.GetDecisionColumn(metaData.DisplayOrder, metaData);
        }

        if (metaData.ColumnType == ColumnType.Date)
        {
            return GridColumnBuilder<int>.GetDateColumn(metaData.DisplayOrder, metaData);
        }

        if (metaData.ColumnType == ColumnType.DropDownList)
        {
            // TODO where the humf should this get plugged in!
            // cant BE HARDCODED HERE!!!
            DropDownList lookupList = new DropDownList()
            {
                new DropDownListOption() { Id = 1, Value = "Entry 1", ParenTId = null }, 
                new DropDownListOption() { Id = 2, Value = "Entry 1", ParenTId = null }, 
                new DropDownListOption() { Id = 3, Value = "Entry 1", ParenTId = null }
            };

            return GridColumnBuilder<int>.GetDropDownListColumn(metaData.DisplayOrder, metaData, lookupList);
        }

        throw new Exception("Column Type Not Supported " + metaData);
    }
publicstaticdetaileditor列创建(列元数据)
{
if(metaData.ColumnType==ColumnType.Rank)
{
返回GridColumnBuilder.GetRankColumn(metaData.DisplayOrder,metaData);
}
if(metaData.ColumnType==ColumnType.Decision)
{
返回GridColumnBuilder.GetDecisionColumn(metaData.DisplayOrder,metaData);
}
if(metaData.ColumnType==ColumnType.Date)
{
返回GridColumnBuilder.GetDateColumn(metaData.DisplayOrder,metaData);
}
if(metaData.ColumnType==ColumnType.DropDownList)
{
//该插上电源的地方该怎么办!
//这里不能硬编码!!!
DropDownList lookupList=新的DropDownList()
{
new dropdownlostoption(){Id=1,Value=“Entry 1”,ParenTId=null},
新的dropDownStoption(){Id=2,Value=“Entry 1”,ParenTId=null},
新的dropDownStoption(){Id=3,Value=“Entry 1”,ParenTId=null}
};
返回GridColumnBuilder.GetDropDownListColumn(metaData.DisplayOrder,metaData,lookupList);
}
抛出新异常(“不支持列类型”+元数据);
}

使用带有附加参数的函数重载函数

public static DetailEditorColumn<int> Create(ColumnMetaData metaData, List<T> lookupList)
{
    //what is coded above
    if (metaData.ColumnType == ColumnType.DropDownList)
    {
        if (lookupList == null)
            //handle error
        else
            return GridColumnBuilder<int>.GetDropDownListColumn(metaData.DisplayOrder, metaData, lookupList);
    }
}

public static DetailEditorColumn<int> Create(ColumnMetaData metaData)
{
    return ClassName.Create(metaData, null);
}
publicstaticdetaileditorcolumncreate(ColumnMetaData元数据,List lookupList)
{
//上面的代码是什么
if(metaData.ColumnType==ColumnType.DropDownList)
{
if(lookupList==null)
//处理错误
其他的
返回GridColumnBuilder.GetDropDownListColumn(metaData.DisplayOrder,metaData,lookupList);
}
}
公共静态详细信息编辑器Column Create(ColumnMetaData元数据)
{
返回ClassName.Create(元数据,null);
}

使用带有附加参数的函数重载函数

public static DetailEditorColumn<int> Create(ColumnMetaData metaData, List<T> lookupList)
{
    //what is coded above
    if (metaData.ColumnType == ColumnType.DropDownList)
    {
        if (lookupList == null)
            //handle error
        else
            return GridColumnBuilder<int>.GetDropDownListColumn(metaData.DisplayOrder, metaData, lookupList);
    }
}

public static DetailEditorColumn<int> Create(ColumnMetaData metaData)
{
    return ClassName.Create(metaData, null);
}
publicstaticdetaileditorcolumncreate(ColumnMetaData元数据,List lookupList)
{
//上面的代码是什么
if(metaData.ColumnType==ColumnType.DropDownList)
{
if(lookupList==null)
//处理错误
其他的
返回GridColumnBuilder.GetDropDownListColumn(metaData.DisplayOrder,metaData,lookupList);
}
}
公共静态详细信息编辑器Column Create(ColumnMetaData元数据)
{
返回ClassName.Create(元数据,null);
}

如果您想要更优雅的解决方案,我会明确建议使用here让每个具体的列元数据(如排名、日期、下拉列表等)决定如何使用生成器创建编辑器。它还将帮助您满足一些非功能性需求,如可扩展性和可管理性。

如果您想要更优雅的解决方案,我会明确建议使用here让每个具体的列元数据(如排名、日期、下拉列表等)决定在使用生成器创建编辑器时要做什么。它还将帮助您满足一些非功能性需求,例如可扩展性和可管理性