【问题标题】:Instantiate generic c# List when the reflected type itself is a List当反射类型本身是 List 时,实例化泛型 c# List
【发布时间】:2015-08-19 22:01:22
【问题描述】:

我有一个反射类型,它最终是 List<Type>。所以我有:

Type modelType = GetMyType();

所以 - modelType 可能是 List<ClassA>List<ClassB> 等,视情况而定。

如何创建这种类型,然后填充它?

我知道我可以做到:

var myList = Activator.CreateInstance(modelType);

但是我如何向其中添加项目,我通常会使用 myList.Add(new ClassA())myList.Add(new ClassB()) 知道我真的不知道 ClassAClassB 类型 - 我只知道 modelType 是List<ClassA> - 是否有其他方法可以实例化它以便我可以添加项目?

【问题讨论】:

  • 您要解决什么问题?这看起来很像 XY 问题...
  • 我不熟悉 XY 问题?我从另一个方法获取我的对象类型,然后我需要根据从该方法获得的内容来填充它。

标签: c# asp.net list generics reflection


【解决方案1】:

看看这个例子,它使用Type.GetGenericArguments Method 来检索列表的内部类型。然后像往常一样进行反思。

    static void Main(string[] args)
    {
        Type modelType = GetMyType();
        var myList = Activator.CreateInstance(modelType);

        var listInnerType = modelType.GetGenericArguments()[0];
        var listInnerTypeObject = Activator.CreateInstance(listInnerType);

        var addMethod = modelType.GetMethod("Add");
        addMethod.Invoke(myList, new[] { listInnerTypeObject });
    }
    static Type GetMyType()
    {
        return typeof(List<>).MakeGenericType((new Random().Next(2) == 0) ? typeof(A) : typeof(B));
    }

class A { }
class B { }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 2018-03-29
    • 2023-03-19
    • 1970-01-01
    相关资源
    最近更新 更多