Могу ли я реализовать method_missing в C # 4 и вернуть ли ему значение? - PullRequest
4 голосов
/ 12 ноября 2008

Я пытался выяснить, как реализовать 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, это просто зависает.

Может кто-нибудь помочь, пожалуйста?

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

Ответы [ 3 ]

1 голос
/ 12 ноября 2008

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

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

0 голосов
/ 09 декабря 2008

вместо

return this;

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

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

(до сих пор не знаю, почему, но у меня это работает).

0 голосов
/ 13 ноября 2008

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

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

...