【问题标题】:Create a C# Generic class for repeated code [closed]为重复代码创建一个 C# 泛型类 [关闭]
【发布时间】:2023-04-03 03:20:01
【问题描述】:

您好,我的项目中有以下代码。

if (response == null || response.StatusCode != HttpStatusCode.OK)    
    return new GetDictionaryPlResponse
    {
        Responses = new Responses
        {
            IsSuccess = false,
            ResponseMessage = "There response data is invalid!"
        }
    };

我正在尝试使用 Generic 来简化此操作,并已完成以下操作。

if (response == null || response.StatusCode != HttpStatusCode.OK)
{
    var returnValue = ReturnNullFoundClass
                      .ResponseType<GetDictionaryPlResponse>();
    returnValue.Responses = ReturnNullFoundClass.ResponseNullFound();
    return returnValue;
}

这里是扩展类。

public static class ReturnNullFoundClass
{

    public static Responses ResponseNullFound()
    {
        return new Responses
        {
            IsSuccess = false,
            ResponseMessage = "There response data is invalid!"
        };
    }

    public static T ResponseType<T>() where T : new()
    {
        return new T();
    }
}

我想知道是否有一种方法可以使用 Func 方法而不是声明 3 行来进一步简化。

任何帮助将不胜感激。

【问题讨论】:

  • 你指的是哪3行?
  • 你可以根据 HttpStatusCode 创建一个响应工厂
  • var returnValue = ReturnNullFoundClass .ResponseType(); returnValue.Responses = ReturnNullFoundClass.ResponseNullFound();返回返回值;
  • 你能给我一个ResponseFactory的例子吗?或任何其他方式

标签: c# asp.net linq generics delegates


【解决方案1】:

如果你想要一个静态工厂,你可以试试这样:

public class Responses 
{
    // Some code here
    public bool IsSuccess { get; set; }
    public string ResponseMessage { get; set; }
}

public interface IResponsesContainer
{
    Responses Responses { get; set; }
}

public class GetDictionaryplResponse : IResponsesContainer
{
    public Responses Responses { get; set; }
}

public enum ResponsesTypes
{
    NullFound
}

public static class ResponsesFactory 
{
    public static IResponsesContainer CreateContainer<TContainer>(ResponsesTypes responsesType)
        where TContainer : IResponsesContainer, new()
    {
        var container = new TContainer();
        switch(responsesType)
        {
            case ResponsesTypes.NullFound:
                container.Responses = new Responses()
                {
                    IsSuccess = false,
                    ResponseMessage = "There response data is invalid!"
                };
                return container;
            default:
                throw new NotImplementedException();
        }
    }
}

将您的GetDictionaryPlResponse 类抽象为接口并返回该接口。

这种方式在定义方面有点冗长,但对于未来的增强来说非常灵活。

如果您不希望您的IResponsesContainer 上的Responses 有一个公共设置器,那么您需要稍微更改一下。也许改用抽象类,或者改变接口的工作方式。

EDIT 你这样调用方法

var container = ResponsesFactory.CreateContainer<GetDictionaryplResponse>(ResponsesTypes.NullFound);

【讨论】:

  • 这看起来不错。我怎么称呼这个方法
  • 更新了答案
  • 这正是我想要的,谢谢
  • 如果这满足您的要求,我将不胜感激您将其标记为答案。如果没有,或者您需要更多,请告诉我! :)
【解决方案2】:

您可以做的最好的简化代码的事情就是像DBNull.Value 一样工作。一种实现方式如下:

    public class DictionaryPIResponseNullFound
    {
        public static readonly GetDictionaryPlResponse Value = new GetDictionaryPlResponse
        {
            Responses = new Responses
            {
                IsSuccess = false,
                ResponseMessage = "There response data is invalid!"
            }
        };
    }

那你可以这样称呼它:

    if (response == null || response.StatusCode != HttpStatusCode.OK)    
        return DictionaryPIResponseNullFound.Value;

【讨论】:

  • 我已经看过这种方式,但是您需要在任何地方声明具有具体类型的静态类。我想使用泛型来传递 T 并为其分配响应。
  • 首先,当您的响应在任何地方都基本相同时,为什么您需要有不同类型的响应? (数据无效)如果您碰巧有不同的通用消息,您可以创建不同的静态只读值(每个一个)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-18
  • 2011-04-16
  • 2019-06-04
  • 1970-01-01
相关资源
最近更新 更多