C # - использовать определенный во время выполнения тип в качестве параметра в универсальном методе - PullRequest
1 голос
/ 03 ноября 2011

Вот что я пытаюсь сделать:

PropertyInfo[] propertyInfos = GetProperties(typeofEntity);
Type t = propertyInfos[0].GetType();
IList<t.GetType()> magicalList;

Допустим, что t имеет тип Int32, тогда я хочу, чтобы список был

IList<Int32>

Это не работает, так же как и

IList<Type>

Я не хочу писать дюжину приведений, чтобы вручную найти Тип.

Есть идеи? Спасибо

EDIT ---------------

Я делаю это, потому что хочу передать объекту не запрос NHibernate и автоматически создать критерии, соответствующие значениям свойств объекта.

Ex:

Person{
public string Name
public Phone Phone 
}

Phone{
public int Number
}

Я хочу иметь возможность создать человека с телефоном и передать его в запросе nhibernate, используя DetachedFor <>. Затем я хочу автоматически создать критерии для свойств «сложных» свойств Person, таких как Phone.Number.

Ответы [ 3 ]

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

Вы можете использовать дженерики только с известным типом во время компиляции.
В вашем коде выражение magicalList[0] не будет иметь тип времени компиляции.

Вы можете использовать неIList или сделать все с помощью отражения.

3 голосов
/ 03 ноября 2011

Попробуйте:

var genericType = typeof (List<>).MakeGenericType(t.GetType());
var magicalList = Activator.CreateInstance(genericType);
1 голос
/ 03 ноября 2011

Существует метод System.Type.MakeGenericType, который помогает создавать универсальный тип, передавая аргументы.В вашем случае у вас есть основной тип:

var oGenericType = typeof (IList<>);
var oSpecificType = oGenericType.MakeGenericType(typeof(int));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...