如何删除仅在类型上不同但使用非默认构造函数的方法之间的重复?

本文关键字:构造函数 默认 方法 之间 删除 何删除 类型 | 更新日期: 2023-09-27 18:02:02

你好,我有很多方法(下面2个例子),看起来几乎完全相同。区别在于处理的JSON分支的名称、返回列表类型和添加到列表中的对象的类型。我知道这些示例方法还需要在其主体中进行一些优化,但情况是传递方法当前需要的返回值类型和类类型,并使其全部工作。如果可能的话,我希望避免使用强制类型转换来代替调用方法。

方法1

    public static List<Box> JsonToListOfBoxes(string data)
    {
        List<Box> ListOfBoxes = new List<Box>();
        if(!string.IsNullOrEmpty(data))
        {
            JObject productsJson = JObject.Parse(data);
            JToken jtkProduct;
            jtkProduct = productsJson["boxes"];
            if(jtkProduct != null)
                if(jtkProduct.HasValues)
                {
                    int childrenCount = productsJson["boxes"].Count();
                    for(int x = 0;x < childrenCount;x++)
                        ListOfBoxes.Add(new Box(productsJson["boxes"][x]));
                }
        }
        return ListOfBoxes;
    }

方法2

    public static List<Envelope> JsonToListOfEnvelopes(string data)
    {
        List<Envelope> ListOfEnvelopes = new List<Envelope>();
        if(!string.IsNullOrEmpty(data))
        {
            JObject productsJson = JObject.Parse(data);
            JToken jtkProduct;
            jtkProduct = productsJson["envelopes"];
            if(jtkProduct != null)
                if(jtkProduct.HasValues)
                {
                    int childrenCount = productsJson["envelopes"].Count();
                    for(int x = 0;x < childrenCount;x++)
                        ListOfEnvelopes.Add(new Envelope(productsJson["envelopes"][x]));
                }
        }
        return ListOfEnvelopes;
    }

如何删除仅在类型上不同但使用非默认构造函数的方法之间的重复?

使用泛型你可以做如下修改:(没有参数化泛型构造函数)

    public static List<T> JsonToListOfEnvelopes<T>(string data, string searchString, Func<string, T> creator)
    {
        List<T> ListOfEnvelopes = new List<T>();
        if (!string.IsNullOrEmpty(data))
        {
            JObject productsJson = JObject.Parse(data);
            JToken jtkProduct;
            jtkProduct = productsJson[searchString];
            if (jtkProduct != null)
                if (jtkProduct.HasValues)
                {
                    int childrenCount = productsJson[searchString].Count();
                    for (int x = 0; x < childrenCount; x++)
                        ListOfEnvelopes.Add(creator(productsJson[searchString][x]));
                }
        }
        return ListOfEnvelopes;
    }

你可以把它叫做

        var result = JsonToListOfEnvelopes("data", "boxes", c => { return new Box(c); });
        var result = JsonToListOfEnvelopes("data", "envelopes", c => { return new Envelope(c); });

您可以创建通用方法,其中dataName应该是"boxes"或"envelope ":

public static List<T> JsonToListOfBoxes<T>(string data, string dataName)
{
    List<T> ListOfItems = new List<T>();
    if (!string.IsNullOrEmpty(data))
    {
        JObject productsJson = JObject.Parse(data);
        JToken jtkProduct;
        jtkProduct = productsJson[dataName];
        if (jtkProduct != null)
            if (jtkProduct.HasValues)
            {
                int childrenCount = productsJson[dataName].Count();
                for (int x = 0; x < childrenCount; x++)
                    ListOfItems.Add((T)Activator.CreateInstance(typeof(T), productsJson[dataName][x]));
            }
    }
    return ListOfItems;
}

使用例子:

var list1 = JsonToListOfBoxes<Box>("dataString", "boxes");
var list2 = JsonToListOfBoxes<Envelope>("dataString", "envelopes");

我只是稍微改变了一下@msmolcic的逻辑。

public static List<T> JsonToListOfBoxes<T>(string data)
{
    List<T> ListOfItems = new List<T>();
    string dataName = typeof(T) == typeof(Box) ? "boxes" : "envelopes";
      //if there are many types one can try in below way..
      // if (typeof(T) == typeof(Box))
      //  {
      //      dataName = "Box";
      //  }
      //  else if (typeof(T) == typeof(Envelope))
      //  {
      //      dataName = "envelopes";
      //  }
    if (!string.IsNullOrEmpty(data))
    {
        JObject productsJson = JObject.Parse(data);
        JToken jtkProduct;
        jtkProduct = productsJson[dataName];
        if (jtkProduct != null)
            if (jtkProduct.HasValues)
            {
                int childrenCount = productsJson[dataName].Count();
                for (int x = 0; x < childrenCount; x++)
                    ListOfItems.Add((T)Activator.CreateInstance(typeof(T), productsJson[dataName][x]));
            }
    }
    return ListOfItems;
}