2009-08-12 69 views
5

我想使用反射根據文件中的數據設置一些字段。我可以擁有的信息是TypeName,TypeValue和FieldName。使用反射設置Int32的值

雖然這對於類(Activator.CreateInstance和PropertyInfo.SetValue)來說是微不足道的,但當涉及到像Int32這樣的沒有任何屬性的值類型時,我有點沉悶。我發現IsValueType在這些類型上是真實的,但由於我的TypeValue是一個字符串(即字符串TypeValue =「400」),我不知道如何分配它。

是否必須使用GetMethods()來檢查是否存在.Parse方法?這是一個TypeConverter

我知道我可以硬編碼一些常見的值類型(反正沒有那麼多)並且有一個大的switch()語句,但我想知道是否有某些東西會自動執行「Convert String to T」轉換?

回答

7
// get the type converters we need 
TypeConverter myConverter = TypeDescriptor.GetConverter(typeof(int)); 

// get the degrees, minutes and seconds value 
int Degrees = (int)myConverter.ConvertFromString(strVal); 

這應該有助於

+0

是這樣,TypeDescriptor上課是我尋找的魔法,謝謝! – 2009-08-12 09:41:25

4

ArsenMkrt是正確的; TypeConverter是去這裏的路;一些額外的想法,但:

你可能會考慮使用「組件模型」,而不是反射;即代替typeof(T).GetProperties(),考慮TypeDescriptor.GetProperties(typeof(T))。這爲您提供了一組PropertyDescriptor記錄,而不是反射PropertyInfo。爲什麼這很方便?

  • ,因爲人們實際上可以指定每個屬性(下圖)的轉換器- 這是公開爲prop.ConverterPropertyDescriptor
  • 如果該文件是大,你可以通過使用HyperDescriptor
獲得的性能提升

作爲屬性的定製的轉換器的示例:

[TypeConverter(typeof(CurrencyConverter))] // bespoke 
public decimal TotalPrice {get;set;}