Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
 Аватар для sigmov
585 / 372 / 63
Регистрация: 22.07.2009
Сообщений: 875
Записей в блоге: 4

Вытащить метод через рефлексию в Делегат

28.04.2011, 17:12. Показов 4089. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Проблема с тем, чтобы вытащить метод через рефлексию.

IL дамп заголовка метода метода:
C#
1
2
.class public sequential ansi serializable sealed beforefieldinit System.RuntimeTypeHandle
.method assembly hidebysig instance bool  CanCastTo(valuetype System.RuntimeTypeHandle target) cil managed
Попытка вытащить метод через рефлексию и созать делегат.
C#
1
2
3
4
5
Delegate.CreateDelegate
(
    typeof(Func<RuntimeTypeHandle, RuntimeTypeHandle, bool>),
    typeof(RuntimeTypeHandle).GetMethod("CanCastTo", BindingFlags.Instance | BindingFlags.NonPublic, null, new Type[] { typeof(RuntimeTypeHandle) }, null)
);
отражение проходит удачно и возвращает MethodInfo, А вот сборка делегата ругается:
C#
1
2
3
Необработанное исключение: System.ArgumentException: Ошибка при связывании с конечным методом.
в System.Delegate.CreateDelegate(Type type, MethodInfo method, Boolean throwOnBindFailure)
.......
Кто может помочь?
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.04.2011, 17:12
Ответы с готовыми решениями:

Вытащить метод из динамически скомпилированного кода через рефлексию в делегат
Помогите пжста. В программе динамически компилирую код из строки, в этом коде - класс с нестатическим методом типа PaintEventHandler;...

Получить список инстансов через рефлексию
Добрый вечер, подскажите пжл, как получить список всех инстансов (объектов) которые реализуют определенный класс или интерфейс? Получить...

Обращение к dll-библиотекам через рефлексию
Добрый день, у меня имеется пару моих dll-библиотек с методом, есть проект, в котором надо загружать и исполнять код из этих библиотек,...

2
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8726 / 3678 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
29.04.2011, 01:27
Твоя ошибка в том что
C#
1
2
3
4
public static Delegate CreateDelegate(
    Type type,
    MethodInfo method
)
может применяться только для статических методов. В .NET 3.5 (судя по прототипам представленных функций) метод CanCastTo не является статическим, он статический в .NET 4.

Тебе надо использовать перегрузку
C#
1
2
3
4
5
public static Delegate CreateDelegate(
    Type type,
    Object target,
    string method
)
вторым параметром которой является нужный экземпляр класса.

Вот, всё создается:
C#
1
2
3
4
5
6
7
8
9
10
var int_type    = typeof(int).TypeHandle;
 
var method = Delegate.CreateDelegate
    (
        typeof(Func<RuntimeTypeHandle, bool>),
        int_type, // null,
        typeof(RuntimeTypeHandle).GetMethod("CanCastTo",
            BindingFlags.NonPublic | BindingFlags.InvokeMethod | BindingFlags.Instance,
            null, new Type[] { typeof(RuntimeTypeHandle) }, null)
    );
p.s. В .NET 4 прототип CanCastTo выглядит так:
C#
1
2
[MethodImpl(MethodImplOptions.InternalCall), SecuritySafeCritical]
internal static extern bool CanCastTo(RuntimeType type, RuntimeType target);
т.е. принимаемые типы не RuntimeTypeHandle. И если ты используешь .NET 4 то скорее всего проблема именно в этом.
1
 Аватар для sigmov
585 / 372 / 63
Регистрация: 22.07.2009
Сообщений: 875
Записей в блоге: 4
29.04.2011, 12:08  [ТС]
Цитата Сообщение от SSTREGG Посмотреть сообщение
только для статических[/URL] методов. В .NET 3.5 (судя по прототипам представленных функций) метод CanCastTo не является статическим, он статический в .NET 4.
1. Это было в NET 1 - 1.1. C NET 2.0 поддерживаются и не статические
2. Метод CanCastTo присутствует в 2х типах: RuntimeType(статический) и RuntimeTypeHandle(instance)
Но поскольку RuntimeType - private тип, вытащить из него метод не вижу возможности, к тому же он все равно пересылает вызов в RuntimeTypeHandle\CanCastTo

Цитата Сообщение от SSTREGG Посмотреть сообщение
Тебе надо использовать перегрузкувторым параметром которой является нужный экземпляр класса.
Можно, но недостаток - неуниверсальность делегата. Фактически привязывает его к target типу. Тогда уж проще через просто invoke.

Цитата Сообщение от SSTREGG Посмотреть сообщение
p.s. В .NET 4 прототип CanCastTo выглядит так:
C#
1
2
[MethodImpl(MethodImplOptions.InternalCall), SecuritySafeCritical]
internal static extern bool CanCastTo(RuntimeType type, RuntimeType target);
т.е. принимаемые типы не RuntimeTypeHandle. И если ты используешь .NET 4 то скорее всего проблема именно в этом.
Он и в 2.0 выглядит так же. )))) См.п2

Спасибо за помощь.

А решение нашел методом научного тыка:
C#
1
2
3
4
5
6
7
8
public delegate bool CanCast(ref RuntimeTypeHandle HandleFrom, IntPtr HandleTo);
public static readonly CanCast CanBeCast =
Delegate.CreateDelegate
(
    typeof(CanCast),
    typeof(RuntimeTypeHandle).GetMethod("CanCastTo", BindingFlags.Instance | BindingFlags.NonPublic, null, new Type[] { typeof(IntPtr) }, null)
)
as CanCast;
Для всех instance методов структур сама структура должна идти как первый параметр с модификатором ref
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.04.2011, 12:08
Помогаю со студенческими работами здесь

Привязка метода к делегату через рефлексию
Необходимо в поле делегата экземпляра класса задавать привязку к методу не обычным путем, а через строковое название метода. Я применил...

Каким образом можно обратиться к методу, полученному через рефлексию?
Не могу понять каким образом можно обратиться к методу полученный через рефлексию , через field полученный через рефлексию . (Пример снизу...

Передать делегат (заранее неизвестный) в метод
Сразу к сути: нужно передать делегат (заранее не известный) в нутрь метода для использования - пытаюсь так: public static void...

Как пробиться через рефлексию к закрытым методам get, set для авто-свойства?
Добрый день. Как пробиться через рефлексию к закрытым методам get, set для авто-свойства? Если стучусь к такому свойству ...

Почему делегат не вызывает метод без Invoke
Есть такой код public delegate bool IsPlaying(); private readonly IsPlaying _isPlaying; Почему так не работает ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru