簡體   English   中英

如何使用反射創建值類型的實例

[英]How to create an instance of value types using reflection

我想創建一個值類型的實例,如System.StringSystem.BooleanSystem.Int32等。我得到像System.String MyNamespace.Employee這樣的類型的限定名稱,我必須創建一個實例並返回。 我使用Activator.CreateInstanceFormatterServices.GetUninitializedObject來創建實例。 但它在值類型的情況下失敗了。 在值類型的情況下,我不能硬編碼邏輯。 我需要一種創建值類型和引用類型實例的通用方法。

你究竟想做什么? FormatterServices.GetUninitializedObject主要由序列化代碼使用; 除此之外你不應該真正使用它。 聽起來你可能只需要類似TypeConverter東西,即(對於這些類型)

TypeConverter tc = TypeDescriptor.GetConverter(someType);
object obj = tc.ConvertFromString(s);

究竟是什么失敗了? 我嘗試了以下代碼來查看值類型是否存在問題:

var instance = Activator.CreateInstance(typeof(Int32));

它給我一個Int32實例設置為0。

您的代碼究竟在哪里失敗? 否則我會說問題在於你加載類型的方式,而不是你創建實例的方式。

對於BCL值類型(以及使用字符串描述類型時),請確保您沒有使用C#關鍵字並確保Type完全符合命名空間。 例如,使用Activator.CreateInstance(..)以這種方式成功創建了C#int

    object num = Activator.CreateInstance(Type.GetType("System.Int32"));

如果您嘗試使用特定於語言的別名(如"int"或短格式(如"Int32"則會出現失敗嘗試。

這對我有用:

int x = (int)Activator.CreateInstance(typeof (Int32), true);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM