最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C# 通過反射獲取類型的字段值及給字段賦值的操作

 更新時(shí)間:2021年01月19日 16:04:09   作者:qq_40693302  
這篇文章主要介紹了C# 通過反射獲取類型的字段值及給字段賦值的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧

舉例:

存在一個(gè)類:

Public Class Student
{
 public string name;
 public int age;
}
Student stu1 = new Student();

現(xiàn)在,我們想通過反射在運(yùn)行時(shí)給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方法有可能會(huì)導(dǎo)致異常,比如 fieldInfo2.SetValue(stu1,“15”),這句話給一個(gè)int型字段賦了string類型的值,編譯是不會(huì)報(bào)錯(cuò)的,在運(yùn)行時(shí)會(huì)拋出一個(gè)System.ArgumentException異常,請(qǐng)多加注意.

有了以上的了解,讓我們寫一個(gè)簡單的動(dòng)態(tài)字段賦值/取值類Dynamic

具體代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
namespace MyUnityHelper
{
 /// <summary>
 /// 動(dòng)態(tài)編譯類
 /// </summary>
 public class Dynamic
 {
  /// <summary>
  /// 動(dòng)態(tài)賦值
  /// </summary>
  /// <param name="obj"></param>
  /// <param name="fieldName"></param>
  /// <param name="value"></param>
  public static void SetValue(object obj,string fieldName,object value)
  {
   FieldInfo info = obj.GetType().GetField(fieldName);
   info.SetValue(obj, value);
  }
  /// <summary>
  /// 泛型動(dòng)態(tài)賦值
  /// </summary>
  /// <typeparam name="T"></typeparam>
  /// <param name="obj"></param>
  /// <param name="fieldName"></param>
  /// <param name="value"></param>
  public static void SetValue<T>(object obj, string fieldName, T value)
  {
   FieldInfo info = obj.GetType().GetField(fieldName);
   info.SetValue(obj, value);
  }
  /// <summary>
  /// 動(dòng)態(tài)取值
  /// </summary>
  /// <param name="obj"></param>
  /// <param name="fieldName"></param>
  /// <returns></returns>
  public static object GetValue(object obj, string fieldName)
  {
   FieldInfo info = obj.GetType().GetField(fieldName);
   return info.GetValue(obj);
  }
  /// <summary>
  /// 動(dòng)態(tài)取值泛型
  /// </summary>
  /// <typeparam name="T"></typeparam>
  /// <param name="obj"></param>
  /// <param name="fieldName"></param>
  /// <returns></returns>
  public static T GetValue<T>(object obj,string fieldName)
  {
   FieldInfo info = obj.GetType().GetField(fieldName);
   return (T)info.GetValue(obj);
  }
 }
}

補(bǔ)充:C#利用反射方法實(shí)現(xiàn)對(duì)象的字段和屬性之間值傳遞

在面向?qū)ο箝_發(fā)過程中,往往會(huì)遇到兩個(gè)對(duì)象之間進(jìn)行值傳遞的情況,如果對(duì)象中的屬性和字段較多,手動(dòng)一一賦值效率實(shí)在太低。

這里就整理了一個(gè)通用的對(duì)象之間進(jìn)行值傳遞的方法,并且考慮到對(duì)象中可能包含類屬性,因此還用到了遞歸以解決這個(gè)問題。

下面上代碼:

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}");
    }
   }
  }

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • C#代碼實(shí)現(xiàn)對(duì)AES加密解密

    C#代碼實(shí)現(xiàn)對(duì)AES加密解密

    這篇文章主要介紹了C#代碼實(shí)現(xiàn)對(duì)AES加密解密的相關(guān)資料,AES是一個(gè)新的可以用于保護(hù)電子數(shù)據(jù)的加密算法,需要的朋友可以參考下
    2015-12-12
  • C# 在PDF文檔中創(chuàng)建表格的實(shí)現(xiàn)方法

    C# 在PDF文檔中創(chuàng)建表格的實(shí)現(xiàn)方法

    表格能夠一目了然的讓用戶看到數(shù)據(jù)信息,使信息顯得有條理化,那么在pdf類型的文檔中如何來添加表格并對(duì)表格進(jìn)行格式化操作呢?下面小編給大家?guī)砹薈# 在PDF文檔中創(chuàng)建表格的實(shí)現(xiàn)方法,需要的朋友參考下吧
    2017-12-12
  • 結(jié)合Visual C#開發(fā)環(huán)境講解C#中事件的訂閱和取消訂閱

    結(jié)合Visual C#開發(fā)環(huán)境講解C#中事件的訂閱和取消訂閱

    這篇文章主要介紹了C#中事件的訂閱和取消訂閱,結(jié)合Visual C#開發(fā)環(huán)境來進(jìn)行講解,Visual C#被集成在微軟的IDE程序Visual Studio中,需要的朋友可以參考下
    2016-01-01
  • C# javascript 讀寫Cookie的方法

    C# javascript 讀寫Cookie的方法

    這篇文章介紹了C# javascript 讀寫Cookie的方法,有需要的朋友可以參考一下
    2013-10-10
  • C#讀取txt文件數(shù)據(jù)的方法實(shí)例

    C#讀取txt文件數(shù)據(jù)的方法實(shí)例

    讀取txt文本數(shù)據(jù)的內(nèi)容,是我們開發(fā)中經(jīng)常會(huì)遇到的一個(gè)功能,這篇文章主要給大家介紹了關(guān)于C#讀取txt文件數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下
    2021-05-05
  • C# FileStream實(shí)現(xiàn)多線程斷點(diǎn)續(xù)傳

    C# FileStream實(shí)現(xiàn)多線程斷點(diǎn)續(xù)傳

    這篇文章主要為大家詳細(xì)介紹了C# FileStream實(shí)現(xiàn)多線程斷點(diǎn)續(xù)傳,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • Unity UI實(shí)現(xiàn)拖拽旋轉(zhuǎn)

    Unity UI實(shí)現(xiàn)拖拽旋轉(zhuǎn)

    這篇文章主要為大家詳細(xì)介紹了Unity UI實(shí)現(xiàn)拖拽旋轉(zhuǎn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • c# 獲得當(dāng)前絕對(duì)路徑的方法(超簡單)

    c# 獲得當(dāng)前絕對(duì)路徑的方法(超簡單)

    下面小編就為大家分享一篇c# 獲得當(dāng)前絕對(duì)路徑的方法(超簡單),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • 簡單介紹C# 中的擴(kuò)展方法

    簡單介紹C# 中的擴(kuò)展方法

    這篇文章主要介紹了C# 中的擴(kuò)展方法的相關(guān)資料,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-08-08
  • C#實(shí)現(xiàn)字符串格式化的五種方式

    C#實(shí)現(xiàn)字符串格式化的五種方式

    C#字符串格式化是一種將數(shù)據(jù)插入到預(yù)定義文本模板中創(chuàng)建新字符串的過程,它允許開發(fā)者更方便地控制輸出內(nèi)容的布局和顯示樣式,本文給大家介紹了C#實(shí)現(xiàn)字符串格式化的五種方式,文中通過代碼示例講解的非常詳細(xì),需要的朋友可以參考下
    2024-07-07

最新評(píng)論

泌阳县| 威宁| 海门市| 合水县| 基隆市| 临邑县| 达州市| 临沧市| 西畴县| 宜黄县| 闸北区| 甘南县| 灵武市| 连云港市| 修武县| 拉萨市| 县级市| 贵德县| 图片| 峨边| 墨竹工卡县| 阜城县| 建阳市| 迁西县| 潍坊市| 临夏县| 青河县| 上林县| 香港 | 同德县| 定兴县| 南岸区| 福鼎市| 桓台县| 凤庆县| 连江县| 铜陵市| 镇安县| 松潘县| 德阳市| 连江县|