1. 程式人生 > >在執行時生成C# .NET類

在執行時生成C# .NET類

​本文譯自​:​[Generating C# .NET Classes at Runtime](https://blog.wedport.co.uk/2020/06/10/generating-c-net-classes-at-runtime/?utm_source=csharpdigest&utm_medium=email&utm_campaign=316) 作者:WedPort 在我的C#職業生涯中,有幾次我不得不在執行時生成新的型別。希望把它寫下來能幫助有相同應用需求的人。這也意味著我以後不必在查詢相同問題的StackOverflow文章了。我最初是在.NET 4.6.2中這樣做的,但我已經更新到為.NET Core 3.0提供了示例。所有程式碼都可以在我的GitHub上面找到。 GitHub:[https://github.com/cheungt6/public/tree/master/ReflectionEmitClassGeneration](https://github.com/cheungt6/public/tree/master/ReflectionEmitClassGeneration) ## 為什麼我需要在執行時生成類? 在執行時生產新型別的需求通常是由於執行時才知道類屬性,滿足效能要求以及需要在新型別中新增功能。當你嘗試這樣做的時候,你應該考慮的第一件事是:這是否真的是一個明智的解決方案。在深入思考之前,還有很多其他事情可以嘗試,問你自己這樣的問題: 1. 我可以使用普通的類嗎 2. 我可以使用Dictionary、Tuple或者物件陣列(Array)? 3. 我是否可以使用擴充套件物件 4. 我確定我不能使用一個普通的類嗎? 如果你認為這仍然是必要的,請繼續閱讀下面的內容。 ## 示例用例 作為一名開發人員,我將大量資料繫結到各種WPF Grids中。大多數時候屬性是固定的,我可以使用預定義的類。有時候,我不得不動態的構建網格,並且能夠在應用程式執行時更改資料。採取以下顯示ID和一些財務資料的類(FTSE和CAC是指數,其屬性代表指數價格): ``` public class PriceHolderViewModel : ViewModelBase { public long Id { get; set; } public decimal FTSE100 { get; set; } public decimal CAC40 { get; set; } } ``` 如果我們僅對其中的屬性感興趣,該類定義的非常棒。但是,如果要使用更多屬性擴充套件此類,則需要在程式碼中新增它,重新編譯並在新版本中進行部署。 相反的,我們可以做的是跟蹤物件所需的屬性,並在執行時構建類。這將允許我們在需要是不斷的新增和刪除屬性,並使用反射來更新它們的值。 ``` // Keep track of my properties var _properties = new Dictionary