Могу ли я реализовать method_missing в C# 4 и заставить его действительно возвращать значение?

Я пытался понять, как реализовать method_missing в C# 4, основываясь на всех двух сообщениях в блогах, плавающих на IDynamicObject.

Я хочу иметь уровень бизнес-логики с репозиторием, и если метод отсутствует на уровне бизнес-логики, просто вызовите репозиторий и передайте его результат. Итак, у меня есть класс, который выглядит так:

public class CustomerServices : IDynamicObject
{
    protected CustomerRepository _Repository = new CustomerRepository();

    MetaObject IDynamicObject.GetMetaObject(Expression parameter)
    {                      
        return new RepositoryMetaObject<CustomerRepository>(_Repository, parameter);                        
    }
} 

В RepositoryMetaObect я реализую метод Call так:

    public override MetaObject Call(CallAction action, MetaObject[] args)
    {
        typeof(T).GetMethod(action.Name).Invoke(_Repository, getParameterArray(args));
        return this;            
    }

(Остальной код RepositoryMetaObject, вероятно, не интересен, но я включил его сюда: http://pastie.org/312842)

Проблема, я думаю, в том, что я ничего не делаю с результатом Invoke, я просто возвращаю сам MetaObject.

Теперь, когда я это делаю:

        dynamic service = new CustomerServices();
        var myCustomer = service.GetByID(1); 

GetByID вызывается, но если я пытаюсь получить доступ к свойству на myCustomer, он просто зависает.

Кто-нибудь может помочь?

Полный код можно скачать на ehre: https://dl.getdropbox.com/u/277640/BusinessLogicLayer.zip

отлично сформулированный и описанный вопрос, со всей информацией, необходимой для ответа, большой палец вверх от меня

Sam Saffron 08.09.2009 03:04
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
1
915
3

Ответы 3

Я считаю, что вам нужно вернуть новый MetaObject с возвращенным значением в виде константного выражения.

Это определенно то, что происходит на эта страница CodeProject. Стоит попробовать :)

but if I try to access a property on myCustomer, is just hangs

Можете ли вы установить точку останова на строке после service.GetByID (1)? Посмотрите, что вы действительно получили от этого звонка. Иначе сложно сказать, что именно произошло.

Вместо

return this;

Попробуй сделать что-то вроде этого

return RepositoryMetaObject<CustomerRepository>(
       _Repository
     , System.Linq.Expressions.Expression.Constant(returnValue, returnValueType)
);

(все еще не уверен, почему, но у меня это работает).

Другие вопросы по теме