代码之家  ›  专栏  ›  技术社区  ›  CuriousDeveloper

如何重载泛型ienumerable

  •  0
  • CuriousDeveloper  · 技术社区  · 5 年前

    我理解,试图重载单个泛型和数组泛型是一个常见问题。所有这些答案都谈到了为什么它会以这种方式工作,以及如何有更好的方式来做,但没有一个答案能说明这一点。我正在寻找关于如何实现我所追求的目标的建议,我对重构持开放态度,并以不同的方式进行重构

    以下是代表问题的代码: https://dotnetfiddle.net/sWrNj3

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Data;
    using System.Data.SqlClient;
    using System.Diagnostics.CodeAnalysis;
    using System.Linq;
    using System.Reflection;
    
    public static class MyParser
    {
        public static void Parse<T>(string name, T value)
        {
            Console.WriteLine($"{name}: single");
        }
    
        // Must take in IEnumerable<T>
        public static void Parse<T>(string name, IEnumerable<T> collection)
        {
            Console.WriteLine($"{name}: IEnumerable");
        }
    
        public static void ParseObj<T>(T data)
        {
            foreach (var prop in data.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public))
            {
                Parse(prop.Name, prop.GetValue(data, null));
            }
        }
    }
    
    public class Program
    {
        public static void Main()
        {
            MyParser.ParseObj(new
            {
                Str = "abc", 
                Num = 543, 
                Arr = new[]{1, 2, 3}, 
                Chars = new char[]{'x', 'y', 'z'}}
            );
        }
    }
    

    结果:

    Str: single
    Num: single
    Arr: single
    Chars: single
    

    渴望的:

    Str: single
    Num: single
    Arr: IEnumerable
    Chars: IEnumerable
    
    0 回复  |  直到 5 年前
        1
  •  0
  •   Murven    5 年前

    我认为你已经掌握了你需要的所有信息,但是你不能把所有的工作委托给编译器,你必须自己做这些工作:

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Data;
    using System.Data.SqlClient;
    using System.Diagnostics.CodeAnalysis;
    using System.Linq;
    using System.Reflection;
    using static System.Console;
    
    public static class MyParser
    {
        public static void ParseObj<T>(T data)
        {
            foreach (var prop in data.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public))
            {
                if(prop.PropertyType.IsArray) WriteLine($"{prop.Name}:array");
                else if(prop.PropertyType == (typeof(string))) WriteLine($"{prop.Name}:string");
                else if(prop.PropertyType.IsValueType) WriteLine($"{prop.Name}:value type");
                else if(typeof(IEnumerable).IsAssignableFrom(prop.PropertyType)) WriteLine($"{prop.Name}:IEnumerable");
                else if(prop.PropertyType.IsEnum) WriteLine($"{prop.Name}:enum");
                else if(prop.PropertyType.IsClass) WriteLine($"{prop.Name}:class");
                else WriteLine($"{prop.Name}:something else");
            }
        }
    }
    
    public class Program
    {
        public static void Main()
        {
            MyParser.ParseObj(new
            {
                Str = "abc"
                , Num = 543
                , Arr = new[]{1, 2, 3}
                , Chars = new char[]{'x', 'y', 'z'}
                , SomeList = new List<string>(){"a","b","c"}
            });
        }
    }
    

    输出:

    Str:string
    Num:value type
    Arr:array
    Chars:array
    SomeList:IEnumerable
    

    *更新* 将代码的演变添加到注释的答案中,以防其他人发现此问题有用:

    1. https://dotnetfiddle.net/Zkx7UJ
    2. https://dotnetfiddle.net/aeCG3z
    3. https://dotnetfiddle.net/6Z49ta
    4. https://dotnetfiddle.net/u5HAFP