本篇文章為大家展示了怎么在C#中利用反射獲取類型的字段值,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:主機域名、虛擬空間、營銷軟件、網(wǎng)站建設(shè)、慶城網(wǎng)站維護、網(wǎng)站推廣。存在一個類:
Public Class Student { public string name; public int age; } Student stu1 = new Student();
現(xiàn)在,我們想通過反射在運行時給stu1的name 和 age字段 賦值,讓name = “小明”,age = 15,怎么做?
簡單的代碼如下:
...略 using System.Reflection;//反射類 ...略 static void Main(string[] args) { Type t = stu1.GetType(); FieldInfo filedInfo1 = t.GetField(”name"); FieldInfo filedInfo2 = t.GetField(”age"); fieldInfo1.SetValue(stu1,"小明"); fieldInfo2.SetValue(stu1,15); }
需要注意的是:FieldInfo的SetValue方法有可能會導(dǎo)致異常,比如 fieldInfo2.SetValue(stu1,“15”),這句話給一個int型字段賦了string類型的值,編譯是不會報錯的,在運行時會拋出一個System.ArgumentException異常,請多加注意.
有了以上的了解,讓我們寫一個簡單的動態(tài)字段賦值/取值類Dynamic
具體代碼如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Reflection; namespace MyUnityHelper { ////// 動態(tài)編譯類 /// public class Dynamic { ////// 動態(tài)賦值 /// /// /// /// public static void SetValue(object obj,string fieldName,object value) { FieldInfo info = obj.GetType().GetField(fieldName); info.SetValue(obj, value); } ////// 泛型動態(tài)賦值 /// ////// /// /// public static void SetValue (object obj, string fieldName, T value) { FieldInfo info = obj.GetType().GetField(fieldName); info.SetValue(obj, value); } /// /// 動態(tài)取值 /// /// /// ///public static object GetValue(object obj, string fieldName) { FieldInfo info = obj.GetType().GetField(fieldName); return info.GetValue(obj); } /// /// 動態(tài)取值泛型 /// ////// /// /// public static T GetValue (object obj,string fieldName) { FieldInfo info = obj.GetType().GetField(fieldName); return (T)info.GetValue(obj); } } }
補充:C#利用反射方法實現(xiàn)對象的字段和屬性之間值傳遞
在面向?qū)ο箝_發(fā)過程中,往往會遇到兩個對象之間進行值傳遞的情況,如果對象中的屬性和字段較多,手動一一賦值效率實在太低。
這里就整理了一個通用的對象之間進行值傳遞的方法,并且考慮到對象中可能包含類屬性,因此還用到了遞歸以解決這個問題。
下面上代碼:
public static void ConvertObject(object SrcClass, object DesClass, bool convertProperty = true, bool convertField = true, bool showError = true) { try { if (SrcClass == null) { return; } if (convertProperty) { PropertyInfo[] srcProperties = SrcClass.GetType().GetProperties(); PropertyInfo[] desProperties = DesClass.GetType().GetProperties(); if (srcProperties.Length > 0 && desProperties.Length > 0) { foreach (var srcPi in srcProperties) { foreach (var desPi in desProperties) { if (srcPi.Name == desPi.Name && srcPi.PropertyType == desPi.PropertyType && desPi.CanWrite) { if (srcPi.PropertyType.IsClass) { ConvertObject(srcPi.GetValue(SrcClass, null), desPi.GetValue(DesClass, null), convertProperty, convertField, showError); } else { Object value = srcPi.GetValue(SrcClass, null); desPi.SetValue(DesClass, value, null); } } } } } } if (convertField) { FieldInfo[] srcFields = SrcClass.GetType().GetFields(); FieldInfo[] desFields = DesClass.GetType().GetFields(); if (srcFields.Length > 0 && desFields.Length > 0) { foreach (var srcField in srcFields) { foreach (var desField in desFields) { if (srcField.Name == desField.Name && srcField.FieldType == desField.FieldType) { if (srcField.FieldType.IsClass) { ConvertObject(srcField.GetValue(SrcClass), desField.GetValue(DesClass), convertProperty, convertField, showError); } else { Object value = srcField.GetValue(SrcClass); desField.SetValue(DesClass, value); } } } } } } } catch (Exception ex) { if (showError) { MessageBox.Show($"Convert Error: Method={nameof(ConvertObject)}, Message={ex.Message}"); } else { throw new Exception($"Convert Error: Method={nameof(ConvertObject)}, Message={ex.Message}"); } } }
上述內(nèi)容就是怎么在C#中利用反射獲取類型的字段值,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。