2013-07-12 302 views
2

Class2以下有一個屬性需要在調用GetSomething之前設置,不過因爲我訪問Class2時在Class1的頂部,當屬性爲Something類時,該屬性始終爲空。我似乎無法弄清楚如何更改我的代碼以在使用屬性之前設置屬性。任何人?如何在初始化靜態類之前初始化靜態屬性?

編輯 我想從form1的構造函數傳遞依賴關係,而不是將其進一步硬編碼到鏈上。

public partial class form1 
{ 
    private static readonly ISomeConstructedClass someConstructedClass = Class1.SomeConstructedClass; 
    public form1() 
    { 
     someConstructedClass.SomeDependency = new SomeDependency(); 
     someConstructedClass.Whatever(); 
    } 
} 
public static class Class1 
{ 
    public static readonly ISomething something = (ISomething)Class2.GetSomething("something"); 
    public static ISomeConstructedClass SomeConstructedClass 
    { 
    get 
    { 
     return something.SomeConstructedClass; 
    } 
    } 

} .... }

public class Class2 
{ 
    public static ISomeDependency SomeDependency 
    { 
     get; 
     set; 
    } 
    public static GetSomething(string something) 
    { 
     switch(something) 
     { 
      case "something": 
       return new Something(SomeDependency); 
     }   
    } 
} 

    public class Something : ISomething 
    { 
     public ISomeDependency SomeDependency 
     { 
      get; 
      set; 
     } 
     public Something(ISomeDependency someDependency) 
     { 
      SomeDependency = someDependency; 
     } 
    } 
+1

你在哪裏初始化屬性? – SLaks

+0

@SLaks - 我添加了更多的代碼,希望能夠回答你的問題。 –

+0

如果你只是想在form1的構造函數中設置它,你爲什麼要用Class2中的SomeDependency初始化'someConstructedClass'?在將它設置爲'New SomeDependency()'之前,你想要設置什麼? – Cemafor

回答

2

[回覆]編輯:

我感到無所適從,你試圖做之前,你只需要創建依賴第一。

public partial class form1 
{ 
    private static /*readonly*/ ISomeConstructedClass someConstructedClass; 
    public form1() 
    { 
     Class2.SomeDependency = new SomeDependency(); 
     someConstructedClass = Class1.SomeConstructedClass; 
     someConstructedClass.Whatever(); 
    } 
} 

我還要動的東西創建到屬性只是爲了確保它沒有被初始化太快(Form1構造函數被調用之前)。

public static class Class1 
{ 
    public static ISomething something; 
    public static ISomeConstructedClass SomeConstructedClass 
    { 
     get 
     { 
      if (something == null) { 
       something = (ISomething)Class2.GetSomething("something"); 
      } 
      return something.SomeConstructedClass; 
     } 
    } 
} 

可以使用static constructor。這是在調用/訪問任何靜態(或實例)字段或方法之前調用的。

喜歡的東西:

static Class2() { 
    SomeDependency = SomeDependencyYouNeed; 
} 
+0

如果ISomeDependency在構造函數中硬編碼,這看起來很好,因爲靜態構造函數是無參數的。 – Taylor

+0

@泰勒:是的,我不確定他究竟在哪裏想要獲得依賴關係,所以我想我會提供一些可能有所幫助的東西。 – Cemafor

+0

@Cemafor - 你不能在一個非靜態的構造函數中分配靜態只讀字段,所以你上面的不會工作:( –

0

你爲什麼要使用靜態方法?看起來你正在嘗試一種依賴注入。創建Class2的實例並在構造函數中傳遞依賴項(並且不使用靜態方法),或者將依賴項作爲GetSomething()方法的參數傳遞。

public static GetSomething(string something, ISomeDependency dependency). 
+0

並非所有的東西都需要這種依賴,所以將它傳遞給GetSomething是沒有意義的 –