c# - 强制转换为 IEnumerable<T>,其中 T 是运行时类型

标签 c# .net generics reflection

<分区>

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

我创建了一个 MyGenericType<T>在运行时 T是运行时类型:

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

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

我不能使用 dynamic作为MyGenericType仅显式而非隐式实现 IEnumerable。

有没有办法转换成 IEnumerable<runtimeType>

最佳答案

创建一个通用调用方方法并改为调用它。在我的代码示例中,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);
}

关于c# - 强制转换为 IEnumerable<T>,其中 T 是运行时类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48923994/

相关文章:

java - 什么是原始类型,为什么我们不应该使用它呢?

c# - WCF Web 服务中的委派

c# - 一个方法应该有多少条返回语句?

c# - 对象类型具有 ToString()、GetHashCode()、GetType 等方法的原因是什么

c# - 在 web.config 文件中添加命名空间有什么好处?

java - 休息API : Raw Type warning extending a Generic Class

c# - 默认情况下,查询字段提升权重的最小值和最大值是多少?

c# - 为什么 RhinoMocks 在我的测试中抛出 InvalidOperationException?

c# - 正则表达式 - 如何制作前瞻模式

java - instanceof List 和 instanceof List<?> 的区别