在執行時生成C# .NET類
阿新 • • 發佈:2020-06-22
本文譯自:[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