2013-02-25 22 views
3

如何根據parametres在構造函數中調用基構造函數? 例如:如何根據某些參數調用構造函數中的基構造函數?

public SomeConstructor(){ 
     if(SomeParameter == "something") //here call base("something"); 
      else //here call base("something else") 
} 

在我的例子

SomeParameter 

例如可以爲本地計算機名稱。

爲了解釋我在做什麼,我想確定取決於計算機名稱的構造函數。我正在開發MVC項目,當我在服務器上發佈項目時,我仍然忘記了連接字符串的更改名稱。所以,我想,如果指定的計算機名稱==我的計算機的名稱,然後調用

:base("DefaultConnection") 

否則,請致電例如

:base("ServerConnectionString") 
+1

我編輯了自己的冠軍。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 – 2013-02-25 16:41:05

+0

好的,對不起。我下次不會那樣做。 – 2013-02-25 16:53:25

回答

6

你不能做到這一點的方式,你只能叫在你的後面的例子,即使這樣,你的例子都傳遞一個字符串,而不是改變參數類型,所以這似乎毫無意義(他們甚至不是你調用的不同的構造函數)。你可以用傳統的方式調用構造函數,並確保提供的值在此之前是有效的值。

作爲一個即興例如,請考慮以下幾點:

public SomeConstructor() 
    : base(Configuration.ConnectionString) { 

} 

public static Configuration { 
    public static string ConnectionString { 
    get { 
     /* some logic to determine the appropriate value */ 
#if DEBUG 
     return ConfigurationManager.ConnectionStrings["DebugConnectionString"]; 
#else 
     return ConfigurationManager.ConnectionStrings["ReleaseConnectionString"]; 
#endif 
    } 
    } 
} 
+0

非常感謝你的幫助。它工作得很好。我不知道爲什麼我做了這個想法之前:)謝謝 – 2013-02-25 16:49:40

1

試試這個:

public class TestInherit : Child 
{ 
    public TestInherit() 
     : base(Environment.MachineName=="MyPC" ? "here" : "there") 
    { 
    } 

} 

public class Child 
{ 
    public Child(string name) { } 
} 
+0

謝謝你太沒有命中。你的想法也非常有用。謝謝。 – 2013-02-25 16:50:05

2

你不能調用不同的構造函數,但你可以發送不同的值相同的構造,使用條件執行者:

public SomeConstructor() 
    : base(SomeParameter == "something" ? "something" : "something else") { 
} 

如果您需要使用不同的基礎構造函數,你會爲每個構造器創建一個構造器,並使用靜態方法在不同的構造器之間進行選擇。例如:

private SomeConstructor() : base("some", "thing") {} 

private SomeConstructor(bool flag) : base("some", "other", "thing") {} 

public SomeConstructor Create() { 
    if (SomeParameter == "something") { 
    return new SomeConstructor(); 
    } else { 
    return new SomeConstructor(true); 
    } 
} 

(這裏我用了一個布爾參數只是爲了構造特徵不同,您可以有不同的數據發送到他們,所以你並不需要區分他們的方式。)

1

根據構建配置使用具有不同值的連接字符串。這通過Config file transformations實現。

的Web.config使用

<connectionStrings> 
    <add name="Foo" connectionString="DefaultConnection" /> 
    </connectionStrings> 

如果Web.Release.config使用

<connectionStrings> 
    <add name="Foo" connectionString="ServerConnectionString" 
     xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/> 
    </connectionStrings> 

當你將建立在發佈配置項目,的Web.config會有Foo連接字符串,值爲ServerConnectionString

另外我建議你使用SlowCheetah包,它允許你轉換你的應用程序。配置或基於構建配置的任何其他XML文件。


正如我在評論中提到的,如果你不希望依賴於構建配置出於某種原因,那麼你可以問正確的參數的依賴注入框架(團結,Ninject,等等)。這是樣品Ninject:

Bind<IFoo>().To<Foo>().WithConstructorArgument("bar", 
    context => IsLocalMachine ? "DefaultConnection" : "ServerConnectionString"); 

當美孚將(在你的情況的DbContext)被實例化,適當的字符串將被傳遞給構造函數:

public class Foo : FooBase, IFoo 
{ 
    public Foo(string bar) : base(bar) 
    {    
    } 
} 
+1

很好的瞭解。謝謝。 – 2013-02-25 16:57:12

+1

@AdrianKsiężarczyk順便說一句,如果你想根據機器名稱,而不是構建配置不同的字符串,那麼它很容易與依賴注入框架解決(適當的連接字符串的名稱將被注入的構造函數) – 2013-02-25 17:00:40

+1

@AdrianKsiężarczyk我加去離子水樣爲你:) – 2013-02-25 17:12:14