如何在一种方法中转换两种几乎相同的方法?

时间:2020-02-24 10:51:33

标签: c# asp.net-core .net-core

我有一个.net核心应用,我有两个方法。一种是概述页面,另一种是细节页面。

这两种方法,都使用两种不同的方法。但是这两种不同的方法几乎是相同的。在每种方法中,pas只是一个不同的参数:

所以这是两种几乎相同的方法:


 public class EcheqSubmission{

public EcheqSubmissionStatusApi StatusDbToApi(EcheqSubmissionStatus dbStatus, EcheqSubmissionInfoApi echeqSubmissionInfoApi)
        {
            EcheqSubmissionStatusApi status;
           // EcheqSubmissionInfoApi echeqSubmissionInfoApi = new EcheqSubmissionInfoApi();

            if (echeqSubmissionInfoApi.ValidUntilUtc < DateTime.Now)
            {
                return EcheqSubmissionStatusApi.Expired;
            }
            else
            {

                switch (dbStatus)
                {
                    case EcheqSubmissionStatus.New:
                        status = EcheqSubmissionStatusApi.New;
                        break;
                    case EcheqSubmissionStatus.Active:
                        status = EcheqSubmissionStatusApi.Active;
                        break;
                    case EcheqSubmissionStatus.Submitted:
                        status = EcheqSubmissionStatusApi.Submitted;
                        break;                   
                    default:
                        throw new ArgumentOutOfRangeException(nameof(dbStatus), dbStatus, "Not a valid status enum");
                }
            }
            return status

}


public EcheqSubmissionStatusApi StatusDbToApi(EcheqSubmissionStatus dbStatus, EcheqSubmissionApi echeqSubmissionInfoApi)
        {
            EcheqSubmissionStatusApi status;
            // EcheqSubmissionInfoApi echeqSubmissionInfoApi = new EcheqSubmissionInfoApi();

            if (echeqSubmissionInfoApi.ValidUntilUtc < DateTime.Now)
            {
                return EcheqSubmissionStatusApi.Expired;
            }
            else
            {

                switch (dbStatus)
                {
                    case EcheqSubmissionStatus.New:
                        status = EcheqSubmissionStatusApi.New;
                        break;
                    case EcheqSubmissionStatus.Active:
                        status = EcheqSubmissionStatusApi.Active;
                        break;
                    case EcheqSubmissionStatus.Submitted:
                        status = EcheqSubmissionStatusApi.Submitted;
                        break;               
                    default:
                        throw new ArgumentOutOfRangeException(nameof(dbStatus), dbStatus, "Not a valid status enum");
                }
            }
            return status;
        }
    }
}

这是两种使用几乎相同方法的方法: 因此,此方法用于详细信息页面


private static EcheqSubmissionApi ConvertToApi(EcheqSubmission submission, EcheqDefinition definition,
           bool includeAnswers, bool includePages, string assignedByName)
        {
            var result =  new EcheqSubmissionApi
            {
                Id = submission.Id,
                SubmittedOnUtc = submission.SubmittedOnUtc,
                AssignedByOrgId = submission.AssignedByOrgId,
                AssignedByProfId = submission.AssignedByProfId,
                AssignedByProfName = assignedByName,
                AssignedOnUtc = submission.AssignedOnUtc,
                AssignedToId = submission.AssignedToId,
                ValidUntilUtc = submission.ValidUntilUtc,
              //  Status = submission.Status.StatusDbToApi(),
                Definition = definition != null ? EcheqDefinitionConverter.DefinitionDbToApi(definition, noPages: !includePages) : null,
                Answers = includeAnswers ? submission.Answers : null,
                InitialValues = includeAnswers ? submission.InitialValues : null,
                CurrentPage = submission.CurrentPage,
                Progress = submission.Progress
            };

            result.Status = submission.StatusDbToApi(submission.Status, result);

            return result;

        }


并且此方法用于概述页面:

 private static EcheqSubmissionInfoApi ConvertToPartialApi(EcheqSubmission submission)
        {

            var result = new EcheqSubmissionInfoApi
            {
                Id = submission.Id,
                //Status = submission.StatusDbToApi(submission.Status,),
                DefinitionId = submission.DefinitionId,
                SubmittedOnUtc = submission.SubmittedOnUtc,
                AssignedByOrgId = submission.AssignedByOrgId,
                AssignedByProfId = submission.AssignedByProfId,
                AssignedOnUtc = submission.AssignedOnUtc,
                AssignedToId = submission.AssignedToId,
                ValidUntilUtc = submission.ValidUntilUtc,
                CurrentPage = submission.CurrentPage,
                Progress = submission.Progress
            };

            result.Status = submission.StatusDbToApi(submission.Status, result);

            return result;

        }


所以我的问题是:如何在on方法中结合两个switch case方法?

谢谢

像这样:

        public EcheqSubmissionStatusApi StatusDbToApi(EcheqSubmissionStatus dbStatus, EcheqSubmissionInfoApi echeqSubmissionInfoApi = null, EcheqSubmissionApi echeqSubmissionoApi = null)
        {
            EcheqSubmissionStatusApi status;


            var validuntil = echeqSubmissionInfoApi != null ? echeqSubmissionInfoApi.ValidUntilUtc : (echeqSubmissionoApi != null ? echeqSubmissionoApi.ValidUntilUtc : null);
            if (validuntil < DateTime.Now)
            {
                return EcheqSubmissionStatusApi.Expired;
            }
            else
            {

                switch (dbStatus)
                {
                    case EcheqSubmissionStatus.New:
                        status = EcheqSubmissionStatusApi.New;
                        break;
                    case EcheqSubmissionStatus.Active:
                        status = EcheqSubmissionStatusApi.Active;
                        break;
                    case EcheqSubmissionStatus.Submitted:
                        status = EcheqSubmissionStatusApi.Submitted;
                        break;

                    case EcheqSubmissionStatus.Expired:
                        status = EcheqSubmissionStatusApi.Expired;
                        break;
                    default:
                        throw new ArgumentOutOfRangeException(nameof(dbStatus), dbStatus, "Not a valid status enum");
                }
            }
            return status;
        }

我已经做到了:

 public static EcheqSubmissionStatusApi StatusDbToApi(this EcheqSubmissionStatus dbStatus, DateTime dateTime)

那我要在这里通过什么呢?

   Status = submission.Status.StatusDbToApi( ),

我这样子:


public EcheqSubmissionStatusApi StatusDbToApi(EcheqSubmissionStatus dbStatus, DateTime ValidUntilUtc)
        {
            EcheqSubmissionStatusApi status;

            if (ValidUntilUtc < DateTime.Now)
            {
                return EcheqSubmissionStatusApi.Expired;
            }
            else
            {

                switch (dbStatus)
                {
                    case EcheqSubmissionStatus.New:
                        status = EcheqSubmissionStatusApi.New;
                        break;
                    case EcheqSubmissionStatus.Active:
                        status = EcheqSubmissionStatusApi.Active;
                        break;
                    case EcheqSubmissionStatus.Submitted:
                        status = EcheqSubmissionStatusApi.Submitted;
                        break;

                    case EcheqSubmissionStatus.Expired:
                        status = EcheqSubmissionStatusApi.Expired;
                        break;
                    default:
                        throw new ArgumentOutOfRangeException(nameof(dbStatus), dbStatus, "Not a valid status enum");
                }
            }
            return status;

这:


 private static EcheqSubmissionApi ConvertToApi(EcheqSubmission submission, EcheqDefinition definition,
            bool includeAnswers, bool includePages, string assignedByName)
        {
            var result = new EcheqSubmissionApi
            {
                Id = submission.Id,
                SubmittedOnUtc = submission.SubmittedOnUtc,
                AssignedByOrgId = submission.AssignedByOrgId,
                AssignedByProfId = submission.AssignedByProfId,
                AssignedByProfName = assignedByName,
                AssignedOnUtc = submission.AssignedOnUtc,
                AssignedToId = submission.AssignedToId,
                ValidUntilUtc = submission.ValidUntilUtc,
                Status = submission.StatusDbToApi(result.ValidUntilUtc),
                Definition = definition != null ? EcheqDefinitionConverter.DefinitionDbToApi(definition, noPages: !includePages) : null,
                Answers = includeAnswers ? submission.Answers : null,
                InitialValues = includeAnswers ? submission.InitialValues : null,
                CurrentPage = submission.CurrentPage,
                Progress = submission.Progress
            };

            result.Status = submission.StatusDbToApi(submission.Status, result.ValidUntilUtc);

            return result;
        }

但是我得到这个错误:


cannot use local variable, before it is used


   Status = submission.StatusDbToApi(result.ValidUntilUtc),

1 个答案:

答案 0 :(得分:0)

解决方案1:通过创建通用基类

DateSubmitted

调用方法

    public class EcheqSubmissionBase
    {

        public string ValidUntilUtc { get; set; }
    }


    public class EcheqSubmissionStatus : EcheqSubmissionBase
    {
       public string NonCommonPropertyX { get; set; }

    }

    public class EcheqSubmissionInfoApi : EcheqSubmissionBase
    {

        public string NonCommonPropertyY { get; set; }
    }

一个以基类为参数的方法

    var _dbstatusobj = new EcheqSubmissionStatus();
    var EcheqSubmissionInfoApiObject = new EcheqSubmissionInfoApi();

    var result = StatusDbToApi(_dbstatusobj, EcheqSubmissionInfoApi);

解决方案2:可选参数

   public EcheqSubmissionStatusApi StatusDbToApi(EcheqSubmissionStatus dbStatus,        EcheqSubmissionBase EcheqSubmissionBase)
       {
           EcheqSubmissionStatusApi status;
    // EcheqSubmissionInfoApi echeqSubmissionInfoApi = new EcheqSubmissionInfoApi();

    if (EcheqSubmissionBase.ValidUntilUtc < DateTime.Now)
    {
        return EcheqSubmissionStatusApi.Expired;
    }
    else
    {

        switch (dbStatus)
        {
            case EcheqSubmissionStatus.New:
                status = EcheqSubmissionStatusApi.New;
                break;
            case EcheqSubmissionStatus.Active:
                status = EcheqSubmissionStatusApi.Active;
                break;
            case EcheqSubmissionStatus.Submitted:
                status = EcheqSubmissionStatusApi.Submitted;
                break;
            default:
                throw new ArgumentOutOfRangeException(nameof(dbStatus), dbStatus, "Not a valid status enum");
        }
    }
    return status

       }