c# 反射的方式 获取.设置实例字段

本文介绍了一种在C#中实现实体类与Dictionary<string, string>相互转换的方法,通过反射机制获取实体类的属性名及值,便于数据交换和处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


//  设置Dictionary<string, string> 得到实体类的字段名称和值

        public static Dictionary<string, string> GetProperties<T>(T t)

        {

            Dictionary<string, string> ret = new Dictionary<string, string>();

 

            if (t == null)

            {

                return null;

            }

            System.Reflection.PropertyInfo[] properties = t.GetType().GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public);

 

            if (properties.Length <= 0)

            {

                return null;

            }

            foreach (System.Reflection.PropertyInfo item in properties)

            {

                string name = item.Name;                                                  //实体类字段名称

                string value = ObjToStr(item.GetValue(t, null));                //该字段的值

                

                if (item.PropertyType.IsValueType || item.PropertyType.Name.StartsWith("String"))

                {

                        ret.Add(name, value);        //在此可转换value的类型

                }

            }

 

            return ret;

        }

 


//反过来根据Dictionary来设置实体类

 

        public static T SetProperties<T>(T t, Dictionary<string, string> d)

        {

            if (t == null || d == null)

            {

                return default(T);

            }

            System.Reflection.PropertyInfo[] properties = t.GetType().GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public);

 

            if (properties.Length <= 0)

            {

                return default(T);

            }

            foreach (System.Reflection.PropertyInfo item in properties)

            {

                string name = item.Name;                                         //名称

                string value = ObjToStr(item.GetValue(t, null));       //值

 

                if (item.PropertyType.IsValueType || item.PropertyType.Name.StartsWith("String"))

                {

                    string val = d.Where(c => c.Key == name).FirstOrDefault().Value;

                    if (val != null && val != value)

                    {

                        if (item.PropertyType.Name.StartsWith("Nullable`1"))

                        {

                            item.SetValue(t, ObjToDate(val), null);

                        }

                        else

                        {

                            item.SetValue(t, val, null);

                        }

                    }

                }

            }

 

            return t;

        }
//https://blog.youkuaiyun.com/github_37830343/article/details/79030333

<think>好的,我现在需要帮助用户解决如何使用C#反射机制获取类中的字段名称的问题。首先,我需要回忆一下C#反射的基本概念和相关方法。根据用户提供的引用内容,特别是引用[3]和引用[4],里面提到了使用FieldInfo和Type类来获取字段信息。用户的问题很明确,他们需要示例代码来展示如何获取类中的字段名称。首先,我应该确定获取字段的基本步骤:获取类型信息,然后检索字段列表,最后提取名称。接下来,我需要确保代码示例的正确性。根据引用[3],使用Type.GetField或Type.GetFields方法,其中GetFields可以返回所有公共字段。但用户可能也需要非公共字段,所以需要指定BindingFlags。例如,使用BindingFlags.Instance |BindingFlags.Public |BindingFlags.NonPublic来包括所有实例字段,无论访问修饰符如何。 然后,考虑是否需要处理静态字段。在示例中,可以展示如何获取实例字段,如果需要静态字段,可能需要调整BindingFlags为Static。但用户的问题主要是获取字段名称,所以可能先展示一个基本示例,再扩展到更复杂的情况。另外,引用[4]中的代码展示了如何获取类的方法和属性,并使用了自定义特性,这可能对用户有帮助,但用户目前关注的是字段名称。因此,示例应专注于字段获取,而不涉及属性或方法。还需要注意,当使用GetFields时,默认只返回公共字段,所以必须明确指定BindingFlags来包含非公共字段,否则可能遗漏私有或受保护的字段。例如,在引用[3]中,使用了BindingFlags.NonPublic| BindingFlags.Instance来获取私有实例字段。因此,正确的步骤应该是:1.使用typeof(类名)获取Type对象。2.调用Type.GetFields方法,并传入适当的BindingFlags组合。 3.遍历返回的FieldInfo数组,获取每个字段的名称。可能需要处理不同的绑定标志组合,比如包括Public和NonPublic,Instance和Static,根据用户需求调整。但用户的问题没有特别说明要获取哪些类型的字段,所以提供一个全面的示例,包括所有实例字段(公共和非公共)可能更合适。 然后,编写示例代码,确保语法正确,并添加注释说明每个步骤。例如:Typetype =typeof(MyClass); FieldInfo[]fields =type.GetFields(BindingFlags.Instance |BindingFlags.Public| BindingFlags.NonPublic); foreach(FieldInfo fieldin fields) {Console.WriteLine(field.Name); }同时,需要提醒用户注意BindingFlags的使用,因为如果不指定足够的标志,可能无法获取到所有字段。例如,默认情况下,GetFields()只返回公共实例字段,所以必须明确指定NonPublic和Instance来包括私有字段。 此外,用户可能需要了解如何区分公共和非公共字段,或者如何处理静态字段。因此,在相关问题中可以提出这些扩展点,比如如何获取静态字段或如何处理继承的字段。最后,确保回答结构清晰,分步骤说明,并引用相关的引用内容来支持解释,比如引用[3]和引用[2]中关于反射基础的部分。这样用户不仅得到示例代码,还能理解背后的原理。</think>### 如何通过C#反射获取类中的字段名称 通过C#反射获取字段名称的核心步骤是**使用`Type.GetFields()`方法**,结合`BindingFlags`筛选字段范围。以下是具体实现示例: --- #### 步骤1:定义测试类 ```csharp public class Person { public string Name; private int _age; protected static float Height; } ``` --- #### 步骤2:反射获取字段名称 ```csharp using System; using System.Reflection; public class Program { public static void Main() { Type type = typeof(Person); // 获取所有实例字段(公共+非公共) FieldInfo[] instanceFields = type.GetFields( BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance ); // 获取所有静态字段 FieldInfo[] staticFields = type.GetFields( BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static ); Console.WriteLine("实例字段:"); foreach (var field in instanceFields) { Console.WriteLine($"- {field.Name} (类型:{field.FieldType.Name})"); } Console.WriteLine("\n静态字段:"); foreach (var field in staticFields) { Console.WriteLine($"- {field.Name} (类型:{field.FieldType.Name})"); } } } ``` --- #### 输出结果 ``` 实例字段: - Name (类型:String) - _age (类型:Int32) 静态字段: - Height (类型:Single) ``` --- #### 关键点说明 1. **`BindingFlags`组合** - `Public`/`NonPublic`:控制是否包含公共或私有字段 - `Instance`/`Static`:区分实例字段与静态字段 - 必须至少指定`Instance`或`Static`中的一个[^3] 2. **字段信息扩展** 通过`FieldInfo`可进一步获取字段类型(`FieldType`)、访问修饰符(`IsPublic`/`IsPrivate`)等信息[^2] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值