4

IDynamicObject に浮かんでいる 2 つのブログ投稿すべてに基づいて、C# 4 で method_missing を実装する方法を見つけようとしていました。

私がやりたいのは、リポジトリを持つビジネス ロジック レイヤーを用意することです。メソッドがビジネス ロジック レイヤーにない場合は、リポジトリを呼び出してその結果を渡すだけです。だから私はこのようなクラスを持っています:

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 からダウンロードできます。

4

3 に答える 3

1

戻り値を定数式として新しいメタオブジェクトを返す必要があると思います。

それは確かにこのCodeProjectページで起こることです。試すだけの価値があります :)

于 2008-11-12T06:58:09.377 に答える
0

それ以外の

return this;

このようなことをしてみてください

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

(理由はまだわかりませんが、私にとってはうまくいきます)。

于 2008-12-09T19:04:35.853 に答える
0

しかし、myCustomer のプロパティにアクセスしようとすると、ハングするだけです

service.GetByID(1) の後の行にブレークポイントを設定できますか? その電話から実際に得たものを見てください。そうしないと、正確に何が起こったのかわかりません。

于 2008-11-13T03:53:26.630 に答える