Create generic List with reflection

前端 未结 2 571
滥情空心
滥情空心 2020-12-19 09:53

I have a class with a property IEnumerable. How do I make a generic method that creates a new List and assigns that property?

相关标签:
2条回答
  • 2020-12-19 10:11

    Assuming you know the property name, and you know it is an IEnumerable<T> then this function will set it to a list of corresponding type:

    public void AssignListProperty(Object obj, String propName)
    {
      var prop = obj.GetType().GetProperty(propName);
      var listType = typeof(List<>);
      var genericArgs = prop.PropertyType.GetGenericArguments();
      var concreteType = listType.MakeGenericType(genericArgs);
      var newList = Activator.CreateInstance(concreteType);
      prop.SetValue(obj, newList);
    }
    

    Please note this method does no type checking, or error handling. I leave that as an exercise to the user.

    0 讨论(0)
  • 2020-12-19 10:24
    using System;
    using System.Collections.Generic;
    
    namespace ConsoleApplication16
    {
        class Program
        {
            static IEnumerable<int> Func()
            {
                yield return 1;
                yield return 2;
                yield return 3;
            }
    
            static List<int> MakeList()
            {
                return (List<int>)Activator.CreateInstance(typeof(List<int>), Func());
            }
    
            static void Main(string[] args)
            {
                foreach(int i in MakeList())
                {
                    Console.WriteLine(i);
                }
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题