Метод можно только назвать на Типе для который Тип. IsGenericParameter верен

Попробуйте это:

string url = HttpContext.Current.Request.Url.AbsoluteUri;
// http://localhost:1302/TESTERS/Default6.aspx

string path = HttpContext.Current.Request.Url.AbsolutePath;
// /TESTERS/Default6.aspx

string host = HttpContext.Current.Request.Url.Host;
// localhost
19
задан sgmoore 28 August 2009 в 10:42
поделиться

4 ответа

Во-первых, вы сделали неверное предположение, то есть предположили, что члены вернули элементы экземпляра System.Data. SqlClient.SqlConnection , которого у него нет. Были возвращены члены экземпляра System.Type .

Из документации MSDN для DeclaringType :

Получение свойства DeclaringMethod для типа, у которого IsGenericParameter свойство false бросает InvalidOperationException .

Итак ... понятно, что возникает исключение InvalidOperationException , поскольку, естественно, вы здесь не имеете дело с открытым универсальным типом. См. ответ Марка Гравелла для объяснения открытых универсальных типов.

13
ответ дан 30 November 2019 в 03:53
поделиться

Итак, что же такое «Тип, для которого Type.IsGenericParameter истинен»

Это означает, что это аргумент универсального типа в открытом универсальном типе, т.е. там, где мы не выбрали T пока нет; например:

// true
bool isGenParam = typeof(List<>).GetGenericArguments()[0].IsGenericParameter;

// false (T is System.Int32)
bool isGenParam = typeof(List<int>).GetGenericArguments()[0].IsGenericParameter;

Итак; у вас есть какие-нибудь открытые дженерики? Возможно, вы приведете пример того, откуда вы взяли свой obj ?

15
ответ дан 30 November 2019 в 03:53
поделиться

Все улики там. Тип obj - это сам класс Type (или, скорее, странная производная RuntimeType).

В точке сбоя вы зациклились на свойстве класса Type с именем DeclaringMethod . Однако тип, описываемый этим экземпляром класса Type , - это System.Data.SqlClient.SqlConnection , который не является универсальным типом метода.

Следовательно, попытка вызвать метод get on DeclaringMethod приводит к исключению.

Ключ в том, что вы проверяете тип класса Type . Это немного круглое, но подумайте вот о чем: -

SqlConnection s = new SqlConnection();
Type t = s.GetType()
Type ouch = t.GetType()

Что описывает класс ой?

3
ответ дан 30 November 2019 в 03:53
поделиться

Как мне избежать этой ошибки без попытки / улова?

Вы почти наверняка не сможете. Когда вы вызываете p.GetValue , вы вызываете метод получения для этого свойства, который может вызвать любое исключение. Например, SqlConnection.ServerVersion сгенерирует исключение, если соединение закрыто, и вы должны это обработать.

Откуда берутся эти дополнительные члены?

Ваш obj уже содержит ] RuntimeType объект, представляющий SqlConnection , а не экземпляр SqlConnection . obj.GetMembers () вернет 65 членов класса SqlConnection , но, снова вызвав GetType () , вы получите 188 членов RuntimeType . DeclaringMethod в объекте, представляющем TOutput , позволит вам получить объект MethodInfo , представляющий метод ConvertAll <> . Однако, когда RuntimeType представляет класс, идея объявления метода не имеет смысла. Вот почему чтение свойства вызывает исключение, которое вы видели.

DeclaringMethod в объекте, представляющем TOutput , позволит вам получить объект MethodInfo , представляющий метод ConvertAll <> . Однако, когда RuntimeType представляет класс, идея объявления метода не имеет смысла. Вот почему чтение свойства вызывает исключение, которое вы видели.

1
ответ дан 30 November 2019 в 03:53
поделиться
Другие вопросы по тегам:

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