创建一个非泛型函数,用于将项添加到HashSet <t>

时间:2017-08-07 09:40:09

标签: c# generics reflection hashset

在我的C#程序中,我想通过反射将项目添加到INSERT INTO table2 (column1, column2, column3, ...) SELECT column1, column2, column3, ... FROM table1 WHERE condition; 。使用HashSet<T>这不是问题,因为我可以将列表强制转换为非通用List<T>接口:

IList

现在我想对foreach (PropertyInfo property in myClass.GetType().GetProperties()) { object value = property.GetValue(myClass); IList valueAsIList = value as IList; if (valueAsIList != null) valueAsIList.Add(item2Insert); } 做同样的事情,但是我没有像HashSet<T>这样的非通用合约,我可以将其转换为IList方法。还有其他办法吗?

2 个答案:

答案 0 :(得分:4)

由于您已经在使用反射,为什么不尝试查找Add方法?

var addMethod = value.GetType().GetMethods().FirstOrDefault(m => m.Name == "Add");

//validate this method; has it been found? What should we do if it didnt? Maybe it should be SingleOrDefault

addMethod.Invoke(value, valueToAdd)

可能会添加更多验证,而不是......:)

答案 1 :(得分:1)

您可以使用dynamic解决此问题。它会照顾&#34;照顾&#34;反思为你工作。

using System;
using System.Collections.Generic;

namespace Bob
{
    public class Program
    {
        static void Main(string[] args)
        {
            var hash = new HashSet<int>();
            Console.WriteLine(hash.Count);
            Add(hash);
            Console.WriteLine(hash.Count);
            Console.ReadLine();
        }

        private static void Add(dynamic hash)
        {
            hash.Add(1);
        }
    }
}