Я испытываю немного отражения и имею вопрос на как бросок объект результата к 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 аргумента?
Смысл приведения обычно состоит в том, чтобы сообщить компилятору, что у вас есть дополнительная информация - что вы что-то знаете во время компиляции . Вы не знаете эту информацию здесь - вы знаете ее только во время выполнения .
Что вы ожидаете сделать со значением после его преобразования? По общему признанию, бывает несколько случаев, когда это было бы полезно - когда вам нужно использовать общий интерфейс, даже если вы хотите получить элементы, для которых не требуется параметр типа (например, Count
в IList
). Однако, если это не то, что вы пытаетесь сделать, было бы действительно полезно, если бы вы могли предоставить дополнительную информацию.
Приведение будет иметь смысл только в том случае, если вызывающая ваша функция new barType во время компиляции, а не среда выполнения ]. И если это так, вы можете просто шаблонировать функцию так:
private IList<T> LoadBars<T>()
{
...
return obj as IList<T>;
}
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 */ });
}
В .NET 4.0 для этого можно использовать деревья выражений.