Создание динамических коллекций типов и массивов - PullRequest
1 голос
/ 28 ноября 2011

Допустим, у меня есть метод, переданный моему методу:

public void AlphaToChar(iList _blah)
{

}

Из IList Я хочу извлечь его члены. Введите и используйте его тип для создания других массивов или списков в методе. Смотрите пример ниже.

«Список = новый список ();» part не работает, потому что, как я полагаю, это переменная типа, а не фактический тип. Есть ли способ обойти это? Как я могу сделать это и создать новую коллекцию извлеченного Типа?

Type[] listTypes =  list.GetType().GetGenericArguments();
Type listType = null;
if (listTypes.Length>0)
{
   listType = listTypes[0];
}
List<listType> = new List<listType>();

Спасибо.

Ответы [ 3 ]

4 голосов
/ 29 ноября 2011

Вы можете сделать конструкцию List<>, используя следующее:

// Find the generic argument type of your old list (theList)
Type genericType = theList.GetType().GetGenericArguments()[0];

// Create a new List with the same generic type as the old one
Type newListType = typeof(List<>).MakeGenericType(genericType);

// Create a new instance of the list with the generic type
var instance = Activator.CreateInstance(newListType);

Но это сработает, только если вы используете общие списки.В приведенном вами примере использовался обычный IList.Вам нужно изменить сигнатуру метода, чтобы использовать универсальный IList<>:

public void AlphaToChar(IList<Something> _blah) { }

или сделать его еще более универсальным:

public void AlphaToChar<T>(IList<T> _blah) /* where T : ISomething, new() */ {}  

Без этого вы должны знатьIList будет содержать, и вам не придется использовать отражение, чтобы выяснить, каковы его типы элементов.

2 голосов
/ 29 ноября 2011

Это динамически создает универсальный List<T> для указанного типа элемента:

IList list = (IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(elementType));

Обратите внимание, что переменная результата статически не типизируется в специализированный список, поскольку вы не знаете тип при компиляциивремя.Таким образом, он не может быть статически типизирован.Вы используете тот факт, что List<T> также реализует IList здесь.

0 голосов
/ 29 ноября 2011
System.Collections.IList list = 
Activator.CreateInstance(typeof(List<>)
.MakeGenericType(listTypes[0])) as System.Collections.IList;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...