C# - Объект броска к IList <T> на основе Типа

Я испытываю немного отражения и имею вопрос на как бросок объект результата к IList.

Вот отражение:

private void LoadBars(Type barType)
{
    // foo has a method that returns bars
    Type foo = typeof(Foo);

    MethodInfo method = foo.GetMethod("GetBars")
        .MakeGenericMethod(bar);

    object obj = method.Invoke(foo, new object[] { /* arguments here */ });
    // how can we cast obj to an IList<Type> - barType
}

Как мы можем бросить результат метода. Вызвать к IList Типа от barType аргумента?

5
задан blu 22 March 2010 в 14:57
поделиться

4 ответа

Смысл приведения обычно состоит в том, чтобы сообщить компилятору, что у вас есть дополнительная информация - что вы что-то знаете во время компиляции . Вы не знаете эту информацию здесь - вы знаете ее только во время выполнения .

Что вы ожидаете сделать со значением после его преобразования? По общему признанию, бывает несколько случаев, когда это было бы полезно - когда вам нужно использовать общий интерфейс, даже если вы хотите получить элементы, для которых не требуется параметр типа (например, Count в IList ). Однако, если это не то, что вы пытаетесь сделать, было бы действительно полезно, если бы вы могли предоставить дополнительную информацию.

5
ответ дан 14 December 2019 в 01:05
поделиться

Приведение будет иметь смысл только в том случае, если вызывающая ваша функция new barType во время компиляции, а не среда выполнения ]. И если это так, вы можете просто шаблонировать функцию так:

private IList<T> LoadBars<T>()
{
...
return obj as IList<T>;
}
0
ответ дан 14 December 2019 в 01:05
поделиться
private void LoadBars<T>()
{
    Type barType = typeof(T);
    // foo has a method that returns bars
    Type foo = typeof(Foo);

    MethodInfo method = foo.GetMethod("GetBars")
        .MakeGenericMethod(bar);

    IList<T> obj = (IList<T>)method.Invoke(foo, new object[] { /* arguments here */ });
}
0
ответ дан 14 December 2019 в 01:05
поделиться

В .NET 4.0 для этого можно использовать деревья выражений.

0
ответ дан 14 December 2019 в 01:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: