首页 > 编程语言 >C#如何以“引用”传递对象的属性

C#如何以“引用”传递对象的属性

时间:2023-11-23 19:34:25浏览次数:29  
标签:Console C# value Height person 引用 WriteLine var 属性

record Person
{
       public int Age;
       public int Height { get; set; }
}

一、声明一个Person类,它有一个字段Age和一个属性Height.

二、针对字段,我们可以通过ref传递引用

代码如下

static void ModifyValue<T>(ref T field, T value)
{
    field = value;
}

var person = new Person();
person.Age = 1;
person.Height = 100;
Console.WriteLine(person);
ModifyValue<int>(ref person.Age, 10);
Console.WriteLine(person);

查看输出:

 三、针对属性,我们尝试使用ref传递

发现报错。

四、那么如何传递一个属性的引用呢?

方式一:通过委托

static void ModifyValueByDelegate1<T>(Action< T> action, T value)
{
    action.Invoke( value);
}

var person = new Person();
person.Age = 1;
person.Height = 100;
Console.WriteLine(person);

ModifyValueByDelegate1<int>(x => person.Height = x, 100111);
Console.WriteLine(person);

方式二:通过反射,我们知道属性其实是一个get方法和一个set方法。

static void ModifyValueByReflection<T,TClass>(MethodInfo method,TClass @class, T value)
{
    method.Invoke(@class,new object?[]{value});
}

var person = new Person();
person.Age = 1;
person.Height = 100;
Console.WriteLine(person);

ModifyValueByReflection<int, Person>(typeof(Person).GetProperty(nameof(person.Height)).GetSetMethod(),person,999);
Console.WriteLine(person);

方式三:借助表达式树

static void ModifyValueByExpression<T,TClass>(Expression<Func<TClass,T>> expression,TClass @class,T value)
{
    var body = (MemberExpression)expression.Body  ;
    var prop =(PropertyInfo) body.Member;
    var setMethod = prop.GetSetMethod();
    setMethod.Invoke(@class, new object?[] { value });
}

var person = new Person();
person.Age = 1;
person.Height = 100;
Console.WriteLine(person);
ModifyValueByExpression(d => d.Height, person, 888);
Console.WriteLine(person);

 

标签:Console,C#,value,Height,person,引用,WriteLine,var,属性
From: https://www.cnblogs.com/lixiang1998/p/17852297.html

相关文章

  • 学ccc我他喵的狠狠学c
    1.不是很熟悉getchar看这个网站getchar函数详解看这一篇就够了-C语言(函数功能、使用、返回值)_lambomercy的博客-CSDN博客2.??博客园不能直接粘贴必须要用ctrl+v 好吧╮(╯-╰)╭3. ......
  • 安装docker脚本-一步到位
    #!/bin/bashyuminstall-yyum-utilsdevice-mapper-persistent-datalvm2yum-config-manager--add-repohttps://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.reposed-i's+download.docker.com+mirrors.aliyun.com/docker-ce+'/etc/yum.repos.d/doc......
  • 文心一言 VS 讯飞星火 VS chatgpt (141)-- 算法导论12.1 1题
    一、用go语言,对于关键字集合(1,4,5,10,16,17,21),分别画出高度为2、3、4、5和6的二又搜索树。文心一言:以下是用Go语言为给定的关键字集合(1,4,5,10,16,17,21)生成的高度为2、3、4、5和6的二叉搜索树。由于二叉搜索树的形状对于不同的生成方式可能会有所不同,所以我这里给出的是......
  • 更换chrome的首页背景图
    在chrome的右下角打开自定义chrome:然后更换主题即可:......
  • postman 出现Enable JavaScript and cookies to continue 如何反爬(js反爬)
    网页无法F12,禁止调试出现debug怎么办直接F8禁用,ctrl+F8开启调试断点网站禁止ip访问,并且关闭了icmp回包,调试最好禁用缓存,以便实时更新用postman单独访问首页的index的首页也是无法获取网页内容考虑网页使用js进行跳转实例:比如使用postman请求https://www.phind.com/简......
  • windows环境nacos安装配置
    1.官网下载地址: https://github.com/alibaba/nacos/releases下载Assets下的zip包; 本地解压,目录结构:conf,bin,target;2.查看conf/application.properties,可修改内部的server.port端口号,默认8848;3.cmd命令到bin目录,执行如下命令启动nacos(默认为集群启动,本次为单......
  • 普通全局异常存在的问题 GlobalExceptionHandler
    简单搭建Feign框架parent<dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId>......
  • CF1475C Ball in Berland
    CF1475CBallinBerlandBallinBerland-洛谷题意在毕业典礼上,有\(a\)个男孩和\(b\)个女孩准备跳舞,不是所有的男孩和女孩都准备结伴跳舞。现在你知道\(k\)个可能的舞伴,你需要选择其中的两对,以便使没有人重复地出现在舞伴里,求可能的数量。思路暴力最朴素,也是简单的方法,就......
  • apache服务
    apache服务安装包httpd服务名称:httpd 是一个网站服务,用于去访问主页的服务 配置文件名称:服务的根目录:/etc/httpd主配置文件:/etc/httpd/conf/httpd.conf网站数据目录:/var/www/html访问日志:/var/log/httpd/access_log错误日志:/var/log/httpd/error_log ......
  • Python Chap3 变量与函数
    #变量与函数##变量1.变量是一个**名字**,它所指代的是一段数据2.使用=来对这段数据的区域进行赋值x=53.新的值会覆盖掉旧的值4.新值的数据类型不必与旧值相同##变量命名规则1.必须以字母或者下划线_开头2.命名可由字母,数字或下划线组成3.大小写敏感4.尽量避免使......