c# 如何利用反射动态获取对象属性的值?

c# 需求得写一个方法能够根据传入的字符串动态获取对应的对象属性值 public 方法名(string 对象名,string 属性名){return …
关注者
13
被浏览
24,661

11 个回答

简介

Mapster是一个快,小巧,功能强大的对象映射.Net框架

大家能看到这里,感谢

分享一组7月录制的C#零基础教程。 我们喜欢做这样的分享,它足够的基础,对新手友好。如果需要的话,就来免费领取吧!

快来领取吧

兴致上来了做了张图,也是干货清单,需要的小伙伴直接来领就是了。

包含VS2022安装包 / C#基础 .NET6/WPF/Winform零基础到各类实战!

上面的资料免费自取:

由于内容过多不便呈现, 需要视频教程和配套源码的小伙伴, 可点击这里,添加我知乎主页个人说明处号码 免费分享

也可直接点击下方卡片: 点击后可自动复制威芯号,并跳转到威芯。得辛苦大家自行搜索威芯号添加。内容已做打包,添加后直接发送注意查收!

例子

我有两个Model类且他们的属性一致,我们将 SourceObjectTest赋值给DestObjectTest该怎么做?

SourceObjectTest sourceObject = new SourceObjectTest();
sourceObject.Name = "张三";
sourceObject.Age = new List<int> { 20, 13, 26 };
sourceObject.Address = "XX省XX市XX县";
sourceObject.Sex = "男";

常规做法

public void Routine(SourceObjectTest sourceObject)
DestObjectTest destObject = new DestObjectTest();
 destObject.Name = sourceObject.Name;
destObject.Sex = sourceObject.Sex;
destObject.Address = sourceObject.Address;
destObject.Age = sourceObject.Age;
}

这种类型的代码写起来相当枯燥乏味且累那么我们可不可以用第三方的库来解决这种问题呢,那肯定是可以的,像AutoMapper和Mapster就是解决这种问题的,而我为什么选择Mapster,主要还是 Mapster性能更好!

安装Mapster包



使用Mapster

基本映射之映射到新对象

 public void BasicMappingNewObject(SourceObjectTest sourceObject)
    DestObjectTest destObject= sourceObject.Adapt<DestObjectTest>();
 }

基本映射之映射到现有对象

 public void BasicMappingExistObject(SourceObjectTest sourceObject)
   DestObjectTest destObject = new DestObjectTest();
   destObject.Name = "李四";
   destObject.Age = new List<int> { 20 };
  destObject.Address = "中国XX省XX市XX县";
  destObject.Sex = "女";    
  destObject = sourceObject.Adapt(destObject);
 }

自定义映射

当我们的映射对象的属性与源对象的属性不一致时我们就可以使用!eg:SourceObjectTest的name属性和DifferentDestObjectTest的UserName是一个意思,只是创建Model类的时候取得名字不一样,这时候基本映射映射不了UserName字段,那我们就要使用自定义映射了!

一:直接在 TypeAdapterConfig 配置对象的映射关系

 public void BasicMappingExtend(SourceObjectTest sourceObject)
var config = new TypeAdapterConfig();
config.ForType<SourceObjectTest, DifferentDestObjectTest>()
            .Map(dest => dest.UserName, src => src.Name)
            .Map(dest => dest.Address, src => src.Name + src.Address);
var mapper = new Mapper(config);
 DifferentDestObjectTest differentDestObjectTest = mapper.Map<DifferentDestObjectTest>(sourceObject);
}

二:使用接口的方式

  public class DifferentDestObjectTestRegister : IRegister
        public void Register(TypeAdapterConfig config)
            config.ForType<SourceObjectTest, DifferentDestObjectTest>()
          .Map(dest => dest.UserName, src => src.Name)
          .Map(dest => dest.Address, src => src.Name + src.Address);
  public void BasicMappingExtend(SourceObjectTest sourceObject)
            var config = new TypeAdapterConfig();
            config.Scan(Assembly.GetExecutingAssembly());
            var mapper = new Mapper(config);
            DifferentDestObjectTest differentDestObjectTest = mapper.Map<DifferentDestObjectTest>(sourceObject);
    }

三:使用映射配置

     public void MappingConfig(SourceObjectTest sourceObject)
            TypeAdapterConfig<SourceObjectTest, DifferentDestObjectTest>
              .NewConfig()