2009-06-10 70 views
3

我有一個具有多個屬性的對象。創建一個將lambda表達式傳遞給構造函數的對象

我希望能夠在我調用構造函數時分配這些屬性的一些。

顯而易見的解決方案是要麼有一個構造函數,爲每個屬性提供一個參數,但是當有很多時,這是很討厭的。另一種解決方案是創建每個都需要屬性值的子集的重載,但最終會導致數十個重載。

所以我想,那豈不是很好,如果我可以說..

MyObject x = new MyObject(o => o.Property1 = "ABC", o.PropertyN = xx, ...);

的問題是,我太昏暗制定如何做到這一點。

你知道嗎?

回答

8

C#3允許您使用它的對象初始化程序語法來執行此操作。

下面是一個例子:

using System; 

class Program 
{ 
    static void Main() 
    { 
     Foo foo = new Foo { Bar = "bar" }; 
    } 
} 

class Foo 
{ 
    public String Bar { get; set; } 
} 

這種工作方式是編譯器創建該類的用編譯器生成的名稱一個實例(如<>g__initLocal0)。然後,編譯器將獲取您初始化的每個屬性並設置該屬性的值。

基本上編譯器會將Main方法上面是這樣的:

static void Main() 
{ 
    // Create an instance of "Foo". 
    Foo <>g__initLocal0 = new Foo(); 
    // Set the property. 
    <>g__initLocal0.Bar = "bar"; 
    // Now create my "Foo" instance and set it 
    // equal to the compiler's instance which 
    // has the property set. 
    Foo foo = <>g__initLocal0; 
} 
+0

Crikey。那很快。 如果我要求更多詳細信息,你會被冒犯嗎?正如我所說,我很昏暗。 – 2009-06-10 12:16:12

+0

當我第一次注意到你的回覆時沒有看到你的例子。 – 2009-06-10 12:17:10

0
class MyObject 
{ 
    public MyObject(params Action<MyObject>[]inputs) 
    { 
      foreach(Action<MyObject> input in inputs) 
      { 
       input(this); 
      } 
    } 
} 

我可能具備的功能的通用樣式錯的,但我認爲這是某種你描述的。

1

基本上什麼安德魯想說的是,如果你有一個類(爲MyObject爲EG)與n個屬性,使用C#3.0的對象初始化語法,可以設置n個屬性的任何子集像這樣:

MyObject x = new MyObject {Property1 = 5,Property4 =「test」,PropertyN = 6.7};

您可以設置任何屬性/字段way./

3

對象初始化語法是最容易使用和需要的構造沒有多餘的代碼。然而,如果你需要做一些更復雜的事情,比如調用方法,你可以有一個構造函數,它需要一個Action參數來執行對象的填充。

public class MyClass 
{ 
    public MyClass(Action<MyClass> populator) 
    { 
     populator.Invoke(this); 
    } 

    public int MyInt { get; set; } 
    public void DoSomething() 
    { 
     Console.WriteLine(this.MyInt); 
    } 
} 

現在你可以像這樣使用它。

var x = new MyClass(mc => { mc.MyInt = 1; mc.DoSomething(); }); 
+0

謝謝馬特。即使在最初的帖子之後的這段時間,我還沒有意識到這一點。 – 2012-03-26 19:12:01

相關問題