欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

舉例:

存在一個(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,怎么做?

簡(jiǎn)單的代碼如下:

...略
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è)簡(jiǎn)單的動(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# 如何在WINForm程序中創(chuàng)建XML文件

    C# 如何在WINForm程序中創(chuàng)建XML文件

    這篇文章主要介紹了C# 如何在WINForm程序中創(chuàng)建XML文件,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-02-02
  • c# 鉤子學(xué)習(xí)筆記

    c# 鉤子學(xué)習(xí)筆記

    今天弄了一下c#的鉤子,沒弄好,但是鉤子安裝成功,可以捕獲鍵盤事件。
    2011-04-04
  • WPF使用Dragablz構(gòu)建可拖拽分離的Tab頁(yè)程序

    WPF使用Dragablz構(gòu)建可拖拽分離的Tab頁(yè)程序

    這篇文章介紹了WPF使用Dragablz構(gòu)建可拖拽分離Tab頁(yè)的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • C# 執(zhí)行bat批處理文件的小例子

    C# 執(zhí)行bat批處理文件的小例子

    這篇文章介紹了C# 執(zhí)行bat批處理文件的小例子,有需要的朋友可以參考一下
    2013-10-10
  • C#中using的使用方式詳解

    C#中using的使用方式詳解

    這篇文章主要介紹了C#中using的使用方式方式詳解,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06
  • C#獲取進(jìn)程或線程相關(guān)信息的方法

    C#獲取進(jìn)程或線程相關(guān)信息的方法

    這篇文章主要介紹了C#獲取進(jìn)程或線程相關(guān)信息的方法,涉及C#操作進(jìn)程及線程的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-08-08
  • C#正方形圖片的繪制方法

    C#正方形圖片的繪制方法

    這篇文章主要為大家詳細(xì)介紹了C#正方形圖片的繪制方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • C# 去除首尾字符或字符串的方法

    C# 去除首尾字符或字符串的方法

    C# 去除首尾字符或字符串的方法,需要的朋友可以參考一下
    2013-04-04
  • 在C#中使用OpenCV(使用OpenCVSharp)的實(shí)現(xiàn)

    在C#中使用OpenCV(使用OpenCVSharp)的實(shí)現(xiàn)

    這篇文章主要介紹了在C#中使用OpenCV(使用OpenCVSharp)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Unity中的Tilemap流程分析

    Unity中的Tilemap流程分析

    這篇文章給大家介紹Unity中的Tilemap流程分析,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-07-07

最新評(píng)論