转换为IEnumerable <t>,其中T是运行时类型

时间:2018-02-22 09:38:46

标签: c# .net generics reflection

这是一个奇怪的问题,我偶然发现,涉及反思:

我在运行时创建MyGenericType<T>,其中T是运行时类型:

object genType = Activator.CreateInstance(typeof(MyGenericType<>).MakeGenericType(runtimeType));

然后我需要将它作为参数传递给另一个只接受IEnumerable<runtimeType>

的函数

我无法使用dynamic,因为MyGenericType只显式实现IEnumerable,而不是隐式实现。

无论如何都要投射到IEnumerable<runtimeType>

1 个答案:

答案 0 :(得分:2)

创建一个通用调用方法并调用它。在我的代码示例中,CallMethod通过反射调用,该方法调用采用IEnumerable<T>

的方法
static void Main(string[] args)
{
    Type runtimeType = typeof(string);

    object genType = Activator.CreateInstance(typeof(MyGenericType<>).MakeGenericType(runtimeType));

    var genericMethod = ((Action<MyGenericType<object>>)CallMethod)
        .Method
        .GetGenericMethodDefinition()
        .MakeGenericMethod(runtimeType)
        .Invoke(null, new object[] { genType });
}

static void CallMethod<T>(MyGenericType<T> myGeneric)
{
    MyEnumerableMethod((IEnumerable<T>)myGeneric);
}