2016-07-04 5 views
0

私はオブジェクトを作成してカスタマイズできるサードパーティのSDKを使用しています。私のオブジェクトの中で、私が望むことを何でもすることができ、自分自身の設定を渡すことができますが、オブジェクト(参照)を渡すことはできません。私の場合、私は参照を得るために必要なコンテキストオブジェクトを持っています。 実行時にインスタンスへの参照を取得するにはどうすればよいですか? 私は問題をシミュレートしようと試みてきた下:これはかなりをやっもちろん実行時にインスタンスへの参照を取得するにはどうすればよいですか?

var myobject = new ClassThatNeedsAReferenceToMyContext(); 

myobject.theContext = myContext; 

には、次のようになります:ClassThatNeedsAReferenceToMyContextタイプを変更することなく、

using System; 

namespace ConsoleApplication 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var runtime = new Runtime(); 
     } 
    } 

    class Runtime 
    { 
     private MyContext myContext; 

     public Runtime() 
     { 
      myContext = new MyContext(); 

      //cant pass my object in 
      var myobject = new ClassThatNeedsAReferenceToMyContext(); 

      if(myobject.theContext == myContext) 
      { 
       Console.WriteLine("Yahoo"); 
      } 
     } 
    } 

    class MyContext 
    { 

    } 

    class ClassThatNeedsAReferenceToMyContext 
    { 
     public ClassThatNeedsAReferenceToMyContext() 
     { 
      //do something here to get a reference to myContext 
     } 
     public MyContext theContext { get; private set; } 
    } 
} 
+0

コンストラクタは任意の種類のパラメータを受け取ることができます。また、オブジェクトへの参照 – Steve

+0

これは単なるシミュレーションです。実際の問題では、クラス "ClassThatNeedsAReferenceToMyContext"はサードパーティのライブラリの一部です。 – Noel

+0

そのクラスを変更することはできませんか?その場合、実現可能な唯一の方法はプロパティを設定することです(ライブラリーの開発者が提供している場合) – Steve

答えて

0

、私はこの結果について、完全にわからないが、今のところ、それが働いています。

class Runtime 
{ 
    private MyContext myContext; 

    public static Mycontext GetMyContext() 
    { 
     return myContext; 
    } 
    public Runtime() 
    { 
     myContext = new MyContext(); 

     //cant pass my object in 
     var myobject = new ClassThatNeedsAReferenceToMyContext(); 

     if(myobject.theContext == myContext) 
     { 
      Console.WriteLine("Yahoo"); 
     } 
    } 
} 

class ClassThatNeedsAReferenceToMyContext 
{ 
    public ClassThatNeedsAReferenceToMyContext() 
    { 
     //do something here to get a reference to myContext 
     theContext = Runtime.GetMyContext(); 
    } 

    public MyContext theContext { get; private set; } 
} 
0

を、あなたは、単にプロパティにコンテキストを割り当てることができますあなたが確信することができるので、冗長テスト、myobject.theContext == myContext

それ以外の場合は、ClassThatNeedsAReferenceToMyContextをコンストラクタ引数としてコンテキストにすることもできます。これは、依存関係がより明確になります:

class ClassThatNeedsAReferenceToMyContext 
{ 
    public ClassThatNeedsAReferenceToMyContext(MyContext context) 
    { 
     this.theContext = context; 
    } 

    public MyContext theContext { get; set; } 
} 

その後、あなただけのコンストラクタへのコンテキストを渡すことができます。他の回答にコメントあたり

var myobject = new ClassThatNeedsAReferenceToMyContext(myContext); 
+0

私は自分のコンテキストを受け入れるように第三者のライブラリを変更することはできません。プロパティ。私は、私の例では、プロパティを非公開にする必要がありました。 – Noel

+1

クラスを変更できず、クラスがコンテキストを設定する方法を提供しない場合、コンテキストを設定する方法はありません。 – poke

+1

Btw。この場合、私はあなたの質問にその部分を理解していません。コメント*「ここで何かをしてmyContextへの参照を取得する」*は、コンテキストをどこかから取得するために実際にコンストラクタを変更できることを示唆しています。 – poke

0

反射アプローチ。一般的に、これはうまくいけば明らかな理由のために悪い考えです。私は完全に異なるアプローチをしようと、私のコンテキストを取得するには、静的メソッドを使用しています

Type type = typeof(ClassThatNeedsAReferenceToMyContext); 
PropertyInfo property = type.GetProperty("theContext"); 
MethodInfo setter = property.GetSetMethod(nonPublic: true); 

MyContext mycontext = new MyContext(); 
ClassThatNeedsAReferenceToMyContext myobject = new ClassThatNeedsAReferenceToMyContext(); 
setter.Invoke(myobject, new[] { mycontext }); 

if (myobject.theContext == mycontext) 
{ 
    Console.WriteLine("Yahoo"); 
} 
+0

これは私が理解しているとおり、実装しようとしても、既存のオブジェクトを参照するのではなく、新しいオブジェクトを参照してくれます。私は静的メソッドを使用して、既存のオブジェクトへのハンドルを与える別のアプローチを検討しています – Noel

+0

これは "setter.Invoke(myobject、new [] {m​​ycontext});"という重要な行です。あなたが気にしているインスタンスを渡してください。私の例で手動で構築したものではありません(myobjectはインスタンスです)。 –

+0

問題は私がメソッドに渡すインスタンスを持っていないことです。私は、すでにこのコントロール領域外で作成されたオブジェクトへの参照を取得する方法があることを期待していました。静的メソッドを使用してこれを達成しました。 – Noel

関連する問題