C# 优化新对象的创建(太多,丑陋的代码)

标签 c# constructor getter-setter

恐怕这个问题可能很愚蠢/我不完全知道如何问这个问题,但我们开始吧:

我目前正在做一个项目,我需要创建很多新对象。 属性由多个 if 设置,代码看起来很乱。

/// <summary>
/// Creates a new <see cref="StockItem"/> based on the <see cref="Article"/> of the given <param name="input"/>.
/// </summary>
/// <param name="input"></param>
public static StockItem CreateStockItem(InputParameterCreateStockItem input)
{
    var returnStockItem = new StockItem();

    //If there is an imob item, start from there and update everything
    if (input.StockItem != null)
    {
        returnStockItem = input.StockItem;
    }
    else
    {
        //When creating a stock item, the status is ALWAYS 1
        returnStockItem.Status = 1;
    }

    #region Properties
    returnStockItem.PartTypeNo = (Int32)input.Article.ArticleNumberPrefix + "-" + input.Article.ArticleNumber.Value.ToString("D8");
    returnStockItem.Kardex = ConvertHelper.GetTechSpecValue(input.Article.TechnicalSpecifications, ConvertHelper.KardexT) ?? String.Empty;
    returnStockItem.WeldNumber = input.WeldNumber;
    returnStockItem.ObjectNo = ConvertHelper.GetTechSpecValue(input.Article.TechnicalSpecifications, ConvertHelper.ObjectNoT) ?? ConvertHelper.GetObjectNo(input.Article);
    returnStockItem.Synonymous = ConvertHelper.GetTechSpecValue(input.Article.TechnicalSpecifications, ConvertHelper.SynonymousT) ?? String.Empty;
    returnStockItem.ExtSerialNo = ConvertHelper.GetTechSpecValue(input.Article.TechnicalSpecifications, ConvertHelper.ExtSerialNoT) ?? String.Empty;
    returnStockItem.ArticleReference = (ConvertHelper.GetTechSpecValue(input.Article.TechnicalSpecifications, ConvertHelper.ArticleReferenceT)) ??
                                   ConvertHelper.RemoveColorCodeFromReference(input.Article.Reference, input.ColorList);
    returnStockItem.ArticleName = ConvertHelper.GetTechSpecValue(input.Article.TechnicalSpecifications, ConvertHelper.ArticleNameT) ??
                              ConvertHelper.GetCorrectTranslation(input.Article.Names, "ENG");
    returnStockItem.Length = ConvertHelper.GetMeasurementInMeters(input.Article, ConvertHelper.ImobLengthT, ConvertHelper.ClsLengthT);
    returnStockItem.Width = ConvertHelper.GetMeasurementInMeters(input.Article, ConvertHelper.ImobWidthT, ConvertHelper.ClsWidthT);
    returnStockItem.Height = ConvertHelper.GetMeasurementInMeters(input.Article, ConvertHelper.ImobHeightT, ConvertHelper.ClsHeightT);
    returnStockItem.Weight =
        Decimal.Parse(!String.IsNullOrEmpty(ConvertHelper.GetTechSpecValue(input.Article.TechnicalSpecifications, ConvertHelper.ImobWeightT))
            ? ConvertHelper.GetTechSpecValue(input.Article.TechnicalSpecifications, ConvertHelper.ImobWeightT)
            : ConvertHelper.GetTechSpecValue(input.Article.TechnicalSpecifications, ConvertHelper.ClsWeightT) ?? "0");
    returnStockItem.DepreciationCode = ConvertHelper.GetTechSpecValue(input.Article.TechnicalSpecifications, ConvertHelper.DepreciationCodeT) ??
                                   (input.Article.DepreciationCode != null ? input.Article.DepreciationCode.InsuranceValueCode.ToString() +
                                    input.Article.DepreciationCode.ActualValueCode.ToString() +
                                    input.Article.DepreciationCode.RevaluationCode.ToString() : String.Empty);
    returnStockItem.Value = ConvertHelper.GetValue(input.Article);
    returnStockItem.ValueDate = ConvertHelper.GetValueDate(input.Article);
    returnStockItem.Brand = ConvertHelper.GetBrand(input.Article);
    returnStockItem.Remarks = ConvertHelper.GetRemarks(input.Article);
    returnStockItem.InsuranceValue = ConvertHelper.GetInsuranceValue(input.Article);
    returnStockItem.StockItemGroupID = ConvertHelper.GetStockItemGroupId(input.Article, input.ClsImobArticleGroups, input.StockItemGroups);
    returnStockItem.StockAllocations = StockAllocationDAO.GetStockAllocationsForArticleGroupIDs(input.Article, input.ClsAssignedArticleGroups, input.ClsUnAssignedArticleGroups, input.ClsImobArticleGroups, input.StockAllocationsDictionaryByCode, input.StockAllocationsDictionaryByName);
    #endregion

    //AddMotherStockItemColorCode(input.Article, stockItem);

    return returnStockItem;
}

我想知道是否有更好(更具可读性)的方法来做到这一点。

我已经做过的事情:

  • 将更复杂的代码移至 Helper 类 (ConvertHelper)
  • 创建了一个输入参数对象(我需要很多列表来检查某些事情)
  • 将整个方法移至工厂(感觉没有必要?)

但整个事情对我来说就是一团糟。

谢谢, 托马斯

最佳答案

您尝试过 AutoMapper 吗? https://github.com/AutoMapper/AutoMapper 花一些时间查看文档,您会发现您很快就会恢复原状。

关于C# 优化新对象的创建(太多,丑陋的代码),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27966166/

相关文章:

c# - 引用几位类(class)成员

c++ - 不允许抛出异常时如何处理失败的构造函数

python - 如果您不介意使用方法访问属性,是否值得使用 Python 的 @property 装饰器?

kotlin - Kotlin 中的 Getter 和 Setter

c# - ASP.NET 中的 session 变量

C# EF 6.1 - 带委托(delegate)的条件查询的 Strage 行为

c# - 具有丰富类型的 C# 中的 Const 正确性

.net - Spring.NET 和构造函数拦截器

c++ - 尽管创建了默认构造函数,但没有合适的默认构造函数可用?

c# - 为什么允许我修改对象初始值设定项只读的属性?