Приведение к IEnumerable<T>, где T - тип времени выполнения
Это странная проблема, с которой я столкнулся, включая рефлексию:
Я создаю MyGenericType<T>
во время выполнения, где T
это тип времени выполнения:
object genType = Activator.CreateInstance(typeof(MyGenericType<>).MakeGenericType(runtimeType));
Затем мне нужно передать его в качестве аргумента другой функции, которая принимает только IEnumerable<runtimeType>
,
Я не могу использовать dynamic
как MyGenericType
только реализует IEnumerable явно, а не неявно.
Есть ли в любом случае, чтобы бросить на IEnumerable<runtimeType>
?
1 ответ
Создайте общий метод вызывающей стороны и вызовите его. В моем примере кода 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);
}