c# 映射取值和赋值

在c#中,有时候需要通过映射关系来实现对对象的取值(包括属性名称和值)。

           TSys_Flow flowData = flowApp.GetFormByTool(FID);
            List<string> nameList = new List<string>();
            PropertyInfo[] type = flowData.GetType().GetProperties();
            foreach (PropertyInfo info in type)
            {
                var name = info.Name;                                        //获得属性的名字,后面就可以根据名字判断来进行些自己想要的操作
                object value = info.GetValue(flowData, null);     //用info.GetValue获得值
                if(value!=null && value.ToString() == "true")
                {
                    nameList.Add(name);
                }
            }
            if(nameList.Count!=0)
            {
                for (int i = 0; i < nameList.Count;i++ )
                {
                  var property = flowData.GetType().GetProperty(nameList[i]);
                  property.SetValue(flowData, null, null);
                }
                flowData.F_State = "0";  //表示未完成
            }
            NFineBase.Current.Update(flowData);

<think>好的,我需要回答用户关于C#中setget的用法的问题。首先,我得回顾一下C#属性的基本概念。属性通常用于封装类的字段,通过getset访问器来控制对字段的访问修改。这有助于实现数据封装数据验证。 记得在C#中,属性可以分为自动属性具有显式实现访问器的属性。自动属性可以简写,比如public string Name { get; set; },编译器会自动生成背后的私有字段。而显式的setget允许在赋值取值时添加逻辑,例如验证输入是否符合要求。 用户可能需要了解如何声明这些属性,以及如何在实际中使用它们。比如,可以举一个简单的例子,定义一个类,其中包含一个带有setget的属性,演示如何通过属性来访问私有字段。另外,可能需要提到只读或只写属性,比如只有get没有set,或者set是私有的,这样可以控制属性的访问权限。 另外,想到可能需要解释属性与字段的区别,为什么推荐使用属性而不是直接公开字段。比如属性可以在访问时添加逻辑,而字段不行。同时,属性可以支持接口实现,而字段不能。 还要考虑用户可能的进阶问题,比如属性初始化器,或者在C# 6.0以后支持的自动属性初始化,例如public int Age { get; set; } = 10;。或者只读自动属性,在构造函数中初始化。 可能需要检查是否有常见的错误用法,例如在set访问器中不小心导致无限递归,比如写成public int Score { get { return Score; } set { Score = value; } },这样会导致堆栈溢出,应该使用背后的字段。 此外,可能需要引用提供的参考内容中的例子,比如引用[1]中的CurrencyRates类,里面的属性都是public,并且有setget,这样可以展示实际应用中的例子,比如Rates属性的类型是Dictionary<string, decimal>,使用setget来封装数据。 最后,生成相关问题的时候,要确保问题与主题相关,并且能够引导用户进一步学习,比如属性与字段的区别,或者如何实现属性验证等。</think>### C#中`set``get`的用法详解 在C#中,`set``get`是属性的访问器(accessors),用于控制对类字段(field)的读写操作。属性结合了字段的简洁性方法的灵活性,常用于实现数据封装、验证逻辑处理。 --- #### 1. **基本语法** 属性的基本结构如下: ```csharp public class MyClass { private int _myField; // 私有字段 // 属性通过getset访问器操作私有字段 public int MyProperty { get { return _myField; } // 读取值时调用 set { _myField = value; } // 写入值时调用(value是隐式参数) } } ``` - `get`:返回属性的值。 - `set`:通过`value`关键字接收新值并赋值给字段。 --- #### 2. **自动属性(Auto-Implemented Properties)** 如果无需额外逻辑,可用自动属性简化代码: ```csharp public string Name { get; set; } // 编译器自动生成私有字段 ``` - **只读自动属性**(需在构造函数中初始化): ```csharp public string Id { get; } = "default_id"; ``` - **私有set**(限制外部修改权限): ```csharp public double Price { get; private set; } ``` --- #### 3. **添加验证逻辑** 通过显式实现`set`访问器,可以添加数据验证: ```csharp private int _age; public int Age { get => _age; set { if (value < 0) throw new ArgumentException("年龄不能为负数"); _age = value; } } ``` --- #### 4. **实际应用示例** 参考引用[1]中的`CurrencyRates`类,属性用于映射JSON数据: ```csharp public class CurrencyRates { public string Disclaimer { get; set; } public string License { get; set; } public int TimeStamp { get; set; } public string Base { get; set; } public Dictionary<string, decimal> Rates { get; set; } } ``` 这里所有属性均通过`get``set`实现数据绑定,确保与JSON结构匹配[^1]。 --- #### 5. **属性 vs 字段** - **字段**:直接存储数据,通常设为`private`。 - **属性**:提供可控的访问接口,支持扩展逻辑。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值