2016-07-04 32 views
0

我正在使用第三方SDK,它允許我通過創建對象來對其進行自定義。在我的對象內部,我可以做任何我想做的事情,它提供了將我自己的配置傳遞給它的功能,但是我無法將對象(引用)傳遞給它。在我的情況下,我有一個我需要參考的上下文對象。 如何在運行時獲取對實例的引用? 下面我試圖模擬該問題:如何在運行時獲得對實例的引用?

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

不改變ClassThatNeedsAReferenceToMyContext類型,你可以簡單地分配上下文屬性:

var myobject = new ClassThatNeedsAReferenceToMyContext(); 

myobject.theContext = myContext; 

當然,這樣做幾乎使以下測試多餘,因爲您可以確定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

順便說一句。在這種情況下,我不明白你的問題中的那一部分。註釋*「在此處執行某些操作以獲取對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

相關問題