Есть ли способ вызвать функциональный "Invoke" без использования Reflection?

Есть ли способ, не используя Reflection, написать что-то по строкам OSteele Functional Invoke в С#?

Это означает, что это используется как:

Action<t> MethodName = StaticUtil.Invoke<t>("MethodName", optionalCurriedArgs);
</t></t>

И затем позвонив:

MethodName(objWithMethodName);

Я знаю, что использование Лямбды сделало бы трюк.

То, что я имею в виду, использует что-то по строкам AS3:

public static function invoke( selectedMethod : String, ... arguments ) : Function {
 var args : Array = arguments.slice();
 return function ( object : * ) : * {
 return object[ selectedMethod ].apply( object, args);
 };
}

Спасибо за чтение.

1 ответ

Нет. В С# нет очевидного способа без использования Reflection для вызова функции в определенном классе. В лучшем случае вы можете попробовать dynamic и разрешить его во время выполнения. Вы можете попробовать использовать библиотеку, такую как FasterFlect чтобы решить вашу проблему.

Кроме того, если вы хотите встроенный метод, который вы можете сделать

typeof(MyObject).InvokeMember(methodName
 ,BindingFlags.Public | BindingFlags.Instance
 ,null
 ,**********
 ,new object[]{parameter1,parameter2})

Я солгал бы вам, если бы сказал, что это не отражение. CLR не был предназначен для того, чтобы вы вызывали методы динамически, как javascript. Это было сознательное решение сделать вызов высокой производительности. Если вам нужно передать функции вокруг делегатов. Если ваш метод нуждается в поддержке переменных аргументов, вы можете использовать перегрузки или params. Если вам нужно динамически вызывать методы через строки: используйте Dictionary или если вы знаете, что у вас есть несколько методов и вам нужна абсолютная скорость, используйте List<tuple<string,delegatetype>></tuple<string,delegatetype>. Если у вас много типов, на которые все отвечают на сообщение, используйте " Interfaces. Если классы не являются вашими собственными, или они специализированы для примитивов, попробуйте dynamic.

С# - хорошо продуманный язык, написанный для стандартных методов кодирования. Есть много вариантов. Если вам действительно нужно, они дают вам инструменты для поиска членов и вызова их. Отражение происходит медленно, потому что CLR был сначала спроектирован как SAFE. Если вам нужно много динамического вызова отражения, вы можете пересмотреть свой выбор дизайна. Если вы все еще не можете найти другого способа, вы все равно можете использовать кеширование и Delegates чтобы сделать это быстро. dynamic полностью выполнена с умным кэшированием и делегатами, а динамика в лучших случаях почти так же быстро, как и собственный код.

Теоретически вы можете создать такой шаблон, как CallSite в DLR, чтобы быстро кэшировать определенный сайт вызова. Я делаю что-то подобное в динамическом прокси, который я написал, чтобы обойти тот факт, что не существует способа создать указатель на открытый общий метод. (например, я хотел иметь mydelegate.Invoke<t>(T arg)</t>).

licensed under cc by-sa 3.0 with attribution.