C#3.0實現突變賦值(Mutantic Assignment)

來源:互聯網
上載者:User

話題從今天TerryLee關於MVC的一段代碼說起:

protected void Application_Start()
{
    RouteTable.Routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with  parameters
        new { controller = "Home", action =  "Index", id = "" }  // Parameter  defaults
    );
}

請注意new { controller = "Home", action = "Index", id = "" }參數,它是C#3.0引入的匿名型別。 由於匿名型別是由編譯器自動產生的類型,MapRoute在編譯時間並不知道其確切類 型,而是在運行時通過反射解析其屬性來擷取資訊。這種方式在文法上顯得優雅 簡潔,它就是所謂的突變賦值(Mutantic Assignment)。

平常我們修改一個form對象的屬性需要若干的指派陳述式:

form.Text = “Hello World”;
form.Top = 100;
form.Left = 200;

如果C#支援突變複製,就可以像這樣一句話搞定:

form := new {Text = “Hello World”, Top =  100, Left = 200};

這樣是不是變得簡潔優雅了?可惜現在C#還沒有對突變賦值運算子 :=的支援 。從更大的層面上,更可惜的是C#運算子多載依然有諸多限制,也沒有像Boo語 言支援的syntax macro。期待在將來的C#中,我們能進行直接定製語言的文法, 讓代碼更加優雅簡潔。但現在我們不得以,退而求其次,只能嘗試在C#3.0中用 擴充方法類比突變賦值功能:

public static class Mutant
{
    public static void  MAssign(this object target, object  source)
    {
        foreach (PropertyInfo pi1 in source.GetType ().GetProperties())
        {
            if (!pi1.CanRead) continue;

            PropertyInfo pi2 = target.GetType ().GetProperty(pi1.Name, pi1.PropertyType);

            if (null == pi2 || !pi2.CanWrite)  continue;

            pi2.SetValue(target, pi1.GetValue(source,  null), null);
        }
    }
}

上面對object類定義了MAssign擴充方法,通過反射擷取和設定屬性值類比突 變賦值。這樣,我們就可以對任意對象進行突變賦值了:

form.MAssign(new {Text = “Hello World”, Top =  100, Left = 200});

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.