Приведение к 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);
}
Другие вопросы по тегам