2016-07-04 43 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

相关问题