真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

怎么在C#中利用反射獲取類型的字段值-創(chuàng)新互聯(lián)

本篇文章為大家展示了怎么在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è)資訊頻道。


當(dāng)前題目:怎么在C#中利用反射獲取類型的字段值-創(chuàng)新互聯(lián)
網(wǎng)頁網(wǎng)址:http://weahome.cn/article/cssphj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部