Попробуйте это:
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
Во-первых, вы сделали неверное предположение, то есть предположили, что члены
вернули элементы экземпляра System.Data. SqlClient.SqlConnection
, которого у него нет. Были возвращены члены экземпляра System.Type
.
Из документации MSDN для DeclaringType :
Получение свойства
DeclaringMethod
для типа, у которогоIsGenericParameter
свойство false бросаетInvalidOperationException
.
Итак ... понятно, что возникает исключение InvalidOperationException
, поскольку, естественно, вы здесь не имеете дело с открытым универсальным типом. См. ответ Марка Гравелла для объяснения открытых универсальных типов.
Итак, что же такое «Тип, для которого 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
?
Все улики там. Тип 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()
Что описывает класс ой?
Как мне избежать этой ошибки без попытки / улова?
Вы почти наверняка не сможете. Когда вы вызываете 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
представляет класс, идея объявления метода не имеет смысла. Вот почему чтение свойства вызывает исключение, которое вы видели.