0

C#4を使用すると、MEFの遅延初期化を利用できます。http://msdn.microsoft.com/en-us/library/dd986615.aspxを参照してください

// So I have this member, populated through MEF.
private Lazy<MyItem, ISomeInterface> item;
public Lazy<MyItem, ISomeInterface> Item
{
    get
    {
        return item;
    }
    set
    {
        item = value;
    }
}

さて、MyItemこの怠惰なメンバー変数に割り当てたいインスタンスがある場合はどうなりますか?これは動作しません:

var myItem = new MyItem(); // Implements ISomeInterface
o.Item = myItem; // Cannot convert type...

更新:サンプルを少し単純化しすぎました。ここでの問題は、(MEFプラグインマネージャーからの)遅延評価されたアイテムがあることですLazy<MyItem, ISomeInterface>。これらのアイテムはすでにインスタンス化されており、次のように構成を要求する場合があります。

var item = new Lazy<MyItem, ISomeInterface>(obj);

ただし、これにより、MissingMemberException遅延初期化された型には、パブリックなパラメーターなしのコンストラクターがありません。」が発生します。

Q :(を実装する)Lazy<T, U>のインスタンスで変数を割り当てるにはどうすればよいですか?TU

4

3 に答える 3

2

または:

Item = new Lazy<Foo>
(
    ()=> 
    { 
        Foo fobj = new Foo() { ID = 99 }; 
        return fobj; 
    }
 );

ソース

于 2013-01-09T08:37:07.100 に答える
0

解決策は、https: //mefcontrib.svn.codeplex.com/svn/trunk/src/MefContrib.Models.Provider/ComposableMember.csを使用するToLazyメソッドを使用することです。MEF

于 2013-01-09T09:56:33.510 に答える
0

私はそれがレイジーと呼ばれていることを知っていますが、少なくともドキュメントを読むことができます!:)

o.Item = new Lazy<MyItem>(InitFunction);
于 2013-01-09T08:35:27.900 に答える