这是我偶然发现的一个奇怪的问题,涉及反射:
我创建了一个 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);
}