Вызвать членов IDynamicMetaObjectProvider без ссылки на Microsoft.CSharp.dll - PullRequest
4 голосов
/ 01 сентября 2010

У меня есть динамическое значение (реализация IDynamicMetaObjectProvider), для которого я хотел бы вызвать методы и свойства.

Примеры, которые я нашел до сих пор при вызове членов для динамических значений, используют типы из Microsoft.CSharp.dll, например,

IDynamicMetaObjectProvider x = GetDynamicValue();
CallSite<Func<CallSite, object, object, object>> site = CallSite<Func<CallSite, object, object, object>>.Create(
            Binder.SetMember(
                Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags.None,
                "Foo",
                null,
                new[] { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null) }
            )
        );
site.Target(site, x, 42);

Я хочу иметь возможность вызывать члены IDynamicMetaObjectProvider без использования Microsoft.CSharp.dll. Обратите внимание, что я не говорю об использовании динамического ключевого слова C # для чего-либо, связанного с C #, а непосредственно об использовании IDynamicMetaObjectProvider.

Также обратите внимание, что использование Reflection не будет работать. Reflection обходит динамическое связывание вызовов и просто выполняет Reflection для базового типа. Мне нужна техника, которая работает с любой реализацией IDynamicMetaObjectProvider.

1 Ответ

3 голосов
/ 14 марта 2011

Вы должны будете реализовать свой собственный CallSiteBinder, так как в нем нет независимой от языка CallSiteBinders. По сути, идея заключается в том, что Binder обрабатывает тонкие различия между информацией, предоставляемой из ваших языков вызова, чтобы выбрать правильного члена для привязки к любому объекту независимо от языка.

Поскольку CSharp Binder не может привязываться к объекту IronPython, гибкость использования различных связывателей в зависимости от языка библиотеки зависит от того, насколько гибко вы предоставляете свою библиотеку. Учитывая приведенный выше пример, если вы не позволяли потребителям библиотеки изменять какие-либо параметры связывателя, то было бы неплохо использовать связыватель CSharp, если вы предлагали больше, возможно, было бы полезно предложить отключить связыватель с помощью внедрения зависимости или перегруженного метода. .

Тем не менее, я думаю, что CSharpBinder должен подойти, если вы хотите передать только некоторые параметры связывателя, потому что связыватель csharp дает вам довольно хорошую гибкость связывания (за исключением того, что не нужно менять привязки на без учета регистра), и это действительно лучший выбор для связывателей в универсальной библиотеке, так как это единственное связывание языков, включенное в стандартную установку .net 4.0 и Mono 2.8.

...