C# Atrribute和反射的简单例子

这篇具有很好参考价值的文章主要介绍了C# Atrribute和反射的简单例子。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Attribute 需要以Attribute 结尾, 并继承Attribute



using AttributeTest;
using System.Reflection;

List<Type> heroTypes = new();
object selecthero;

//所有英雄的类型
heroTypes = Assembly.GetExecutingAssembly().GetTypes()
    .Where(t => t.GetCustomAttributes(typeof(HeroAttribute), false).Any()).ToList();


//英雄的名字
var list = heroTypes.Select(t => t.Name).ToList();

foreach (var item in list)
{
    Console.WriteLine(item);
}

Console.WriteLine("==============");
foreach (var item in heroTypes)
{
    var t = Activator.CreateInstance(item);//创建对象
    var skillMethods = item.GetMethods().Where(m =>
    m.GetCustomAttributes(typeof(SkillAttribute), false)
    .Any()).ToList();

    var methodsName = skillMethods.Select(m => m.Name).ToList();
    methodsName.ForEach(x => Console.WriteLine(x));
}

Console.WriteLine("======+++========");

Blademaster bm = new();

var prop1 = bm.GetType();
var prop2 = typeof(Blademaster);

Console.WriteLine(prop1);
Console.WriteLine(prop2);

Console.WriteLine("======ctor========");
var ctor1 = prop1.GetConstructor(new Type[0]); //获取无参ctor
var ctor2 = prop1.GetConstructor(new Type[] { typeof(string) });
var ctor3 = prop1.GetConstructor(new Type[] { typeof(string), typeof(string) });
Console.WriteLine(ctor1);
Console.WriteLine(ctor2);
Console.WriteLine(ctor3);


Console.WriteLine("======ctors========");
var ctors = prop2.GetConstructors();

foreach (var item in ctors)
{
    Console.WriteLine(item);
}



Student stu = new()
{
    Id = 1,
    Name = "TTT",
    Description = "DDD",
    Birthday = 555
}
;

Blademaster bm3 = new() 
{
    Name = "TTT",
     Height = "666",
     Race = "兽族"
};

var fileds = typeof(Student).GetFields(BindingFlags.NonPublic | BindingFlags.Instance |BindingFlags.Public );

Console.WriteLine("======GetFields========");
foreach (var item in fileds)
{
    Console.WriteLine(item.Name);

}
Console.WriteLine("======GetProperties========");
var fileds2 = typeof(Student).GetProperties(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);


foreach (var item in fileds2)
{
    Console.WriteLine(item.Name);
    Console.WriteLine(item.GetValue(stu));
}

Console.WriteLine("======GetMethods========");
var methods = typeof(Student).GetMethods();

foreach (var item in methods)
{
    Console.WriteLine(item.Name);
}

Console.WriteLine("======GetMembers========");

var members = typeof(Student).GetMembers();

foreach (var item in members)
{
    Console.WriteLine(item.Name);
}

//通过反射建立对象
Console.WriteLine("======通过反射建立对象========");
var obj = Activator.CreateInstance(bm3.GetType());

var pops = obj.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);

foreach (var item in pops)
{
    Console.WriteLine(item.Name);
    Console.WriteLine(item.GetValue(bm3)); //item由反射来的属性,和对象没有关系,如果获得值,需要具体对象

    if (item.Name == "Race")
    {

    }
}



结果 :

Blademaster
==============
JiFengBu
ZhiMingYiJi
======+++========
AttributeTest.Blademaster
AttributeTest.Blademaster
======ctor========
Void .ctor()
Void .ctor(System.String)
Void .ctor(System.String, System.String)
======ctors========
Void .ctor(System.String)
Void .ctor()
Void .ctor(System.String, System.String)
======GetFields========
<Id>k__BackingField
<Name>k__BackingField
<Description>k__BackingField
<Age>k__BackingField
birthday
======GetProperties========
Id
1
Name
TTT
Description
DDD
Age
0
Birthday
555
======GetMethods========
get_Id
set_Id
get_Name
set_Name
get_Description
set_Description
get_Age
set_Age
get_Birthday
set_Birthday
GetType
ToString
Equals
GetHashCode
======GetMembers========
get_Id
set_Id
get_Name
set_Name
get_Description
set_Description
get_Age
set_Age
get_Birthday
set_Birthday
GetType
ToString
Equals
GetHashCode
.ctor
Id
Name
Description
Age
Birthday
======通过反射建立对象========
Name
TTT
Race
兽族
Height
666

工厂模式 webAPI应用

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />
	  <PackageReference Include="Serilog" Version="3.0.1" />
	  <PackageReference Include="Serilog.AspNetCore" Version="6.1.0" />
	  <PackageReference Include="Serilog.Sinks.Async" Version="1.5.0" />
	  <PackageReference Include="Serilog.Sinks.Console" Version="4.1.0" />
	  <PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
  </ItemGroup>

</Project>

using MyWebApiTest.Service;
using MyWebApiTest.Service.Imp;
using Serilog;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.


//日志
builder.Host.UseSerilog((context, logger) =>
{
    logger.ReadFrom.Configuration(context.Configuration);
    logger.Enrich.FromLogContext();
});

// Add services to the container.
builder.Configuration.AddJsonFile("appsettings.json", false, true);
var cfg = builder.Configuration;
builder.Services.AddSingleton<IConfiguration>(cfg);


builder.Services.AddSingleton<IConnFactoryService, ConnFactoryServiceImpl>();

builder.Services.AddControllers();
builder.Services.AddCors(c => c.AddPolicy("any", p => p.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin()));
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}
app.UseCors("any");

app.UseAuthorization();

app.MapControllers();

app.Run();

namespace MyWebApiTest.Service
{
    public interface IConnService
    {
        bool Conn { get; set; }

        void ReadClass();
    }
}

namespace MyWebApiTest.Service
{
    public interface IConnFactoryService
    {
        IConnService CreateConn();
    }
}

namespace MyWebApiTest.Service.Imp
{
    public class ConnServiceImpl2 : IConnService
    {
        private int i = 0;

        public ConnServiceImpl2(ILogger<IConnService> logger)
        {
            this.logger = logger;
        }
        private bool conn;
        private readonly ILogger<IConnService> logger;

        public bool Conn { get => conn; set => conn = value; }

        public void ReadClass()
        {
            i += 3;//每次递增, 调用同一个ConnServiceImpl2
            logger.LogInformation("ConnServiceImpl2在读取数据!@!");
            logger.LogInformation(i.ToString());
        }
    }
}



namespace MyWebApiTest.Service.Imp
{
    public class ConnServiceImpl1 : IConnService
    {
        private int i = 0;
        public ConnServiceImpl1(ILogger<IConnService> logger)
        {
            this.logger = logger;

        }
        private bool conn;
        private readonly ILogger<IConnService> logger;

        public bool Conn { get => conn; set => conn = value; }

        public void ReadClass()
        {
            i += 1;//每次递增, 调用同一个ConnServiceImpl1
            logger.LogInformation("ConnServiceImpl1在读取数据!!");
            logger.LogInformation(i.ToString());
            //Console.WriteLine("ConnServiceImpl1在读取数据!!");
        }
    }
}

namespace MyWebApiTest.Service.Imp
{
    public class ConnFactoryServiceImpl : IConnFactoryService
    {
        private readonly IConnService conn;
        private readonly ILogger<IConnService> logger;

        public ConnFactoryServiceImpl(ILogger<IConnService> logger)
        {
            this.logger = logger;
            this.conn = new ConnServiceImpl1(logger);
        }
        public IConnService CreateConn()
        {
            conn.ReadClass();
            return conn;
        }
    }
}

using Microsoft.AspNetCore.Cors;
using Microsoft.AspNetCore.Mvc;
using MyWebApiTest.Service;

namespace MyWebApiTest.Controllers
{
    [Route("api/private/v1/[controller]/[action]")]
    [ApiController]
    [EnableCors("any")]
    public class MyTestController : ControllerBase
    {
        private readonly ILogger<MyTestController> logger;
        private readonly IConnFactoryService service;

        public MyTestController(ILogger<MyTestController> logger, IConnFactoryService service)
        {
            this.logger = logger;
            this.service = service;
        }

        [HttpGet]
        public void Test1()
        {
            service.CreateConn();
        }
    }
}

更换ConnServiceImpl1为ConnServiceImpl2时, 只需要

this.conn = new ConnServiceImpl1(logger);

换为

this.conn = new ConnServiceImpl2(logger);

使用抽象类:

using MyWebApiTest.Service;
using MyWebApiTest.Service.Imp;
using Serilog;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.


//日志
builder.Host.UseSerilog((context, logger) =>
{
    logger.ReadFrom.Configuration(context.Configuration);
    logger.Enrich.FromLogContext();
});

// Add services to the container.
builder.Configuration.AddJsonFile("appsettings.json", false, true);
var cfg = builder.Configuration;
builder.Services.AddSingleton<IConfiguration>(cfg);


builder.Services.AddSingleton<IConnFactoryService, ConnFactoryServiceImpl2>();
builder.Services.AddSingleton<IConnFactoryService, ConnFactoryServiceImpl1>();

builder.Services.AddControllers();
builder.Services.AddCors(c => c.AddPolicy("any", p => p.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin()));
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}
app.UseCors("any");

app.UseAuthorization();

app.MapControllers();

app.Run();


namespace MyWebApiTest.Service
{
    public abstract class AbstractConnService: IConnService
    {
        private bool conn;
        protected int i = 0;
        private ILogger<AbstractConnService> logger;

        public bool Conn { get; set; }
        public AbstractConnService(ILogger<AbstractConnService> logger)
        {
            this.logger = logger;
        }

        public virtual void ReadClass() 
        {
            i += 2;
            logger.LogInformation("虚方法在读取数据!@!");
            logger.LogInformation(i.ToString());
        }

        public abstract void ReadClass2();
    }
}

namespace MyWebApiTest.Service.Imp
{
    public class ConnServiceImpl2 : AbstractConnService
    {
        private ILogger<AbstractConnService> logger;

        public ConnServiceImpl2(ILogger<AbstractConnService> logger) : base(logger)
        {
            this.logger = logger;
        }

        public override void ReadClass2()
        {
            i += 5;
            logger.LogInformation("重写的抽象方法在读取数据!@!");
            logger.LogInformation(i.ToString());
        }
    }
}

namespace MyWebApiTest.Service.Imp
{
    public class ConnFactoryServiceImpl2 : IConnFactoryService
    {
        private readonly ILogger<AbstractConnService> logger;
        private AbstractConnService connService;

        public ConnFactoryServiceImpl2(ILogger<AbstractConnService> logger)
        {
            this.logger = logger;
            connService = new ConnServiceImpl2(logger);
        }
        public IConnService CreateConn()
        {
            connService.ReadClass();
            connService.ReadClass2();
            return connService;
        }
    }
}

using Microsoft.AspNetCore.Cors;
using Microsoft.AspNetCore.Mvc;
using MyWebApiTest.Service;
using MyWebApiTest.Service.Imp;

namespace MyWebApiTest.Controllers
{
    [Route("api/private/v1/[controller]/[action]")]
    [ApiController]
    [EnableCors("any")]
    public class MyTestController : ControllerBase
    {
        private readonly ILogger<MyTestController> logger;
        private readonly IEnumerable<IConnFactoryService> services;

        public MyTestController(ILogger<MyTestController> logger, IEnumerable<IConnFactoryService> services)
        {
            this.logger = logger;
            this.services = services;
        }

        [HttpGet]
        public void Test1()
        {
            IConnFactoryService? service1 = services.Where(s=>s.GetType() 
            == typeof(ConnFactoryServiceImpl1)).FirstOrDefault();

            service1?.CreateConn();

            IConnFactoryService? service2 = services.Where(s => s.GetType()
            == typeof(ConnFactoryServiceImpl2)).FirstOrDefault();

            service2?.CreateConn();

        }
    }
}

结果:文章来源地址https://www.toymoban.com/news/detail-635096.html

2023-08-14 23:57:02.744 +08:00 MyWebApiTest.Service.IConnService  [INF] ConnServiceImpl1在读取数据!!
2023-08-14 23:57:02.747 +08:00 MyWebApiTest.Service.IConnService  [INF] 1
2023-08-14 23:57:02.750 +08:00 MyWebApiTest.Service.AbstractConnService  [INF] 虚方法在读取数据!@!
2023-08-14 23:57:02.752 +08:00 MyWebApiTest.Service.AbstractConnService  [INF] 2
2023-08-14 23:57:02.754 +08:00 MyWebApiTest.Service.AbstractConnService  [INF] 重写的抽象方法在读取数据!@!
2023-08-14 23:57:02.757 +08:00 MyWebApiTest.Service.AbstractConnService  [INF] 7

到了这里,关于C# Atrribute和反射的简单例子的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C#开发FFMPEG例子(API方式) FFmpeg推送udp组播流

    代码及工程见https://download.csdn.net/download/daqinzl/88156926 开发工具:visual studio 2019 播放,可采用ffmpeg工具集里的ffplay.exe, 执行命令 ffplay udp://238.1.1.10:6016 也可以参考(C#开发FFMPEG例子(API方式) FFmpeg拉取udp组播流并播放) https://blog.csdn.net/daqinzl/article/details/132112075 网上用C/C++调用FFmp

    2024年02月14日
    浏览(39)
  • C#利用自定义特性以及反射,来提大型项目的开发的效率

      在大型项目的开发过程中,需要多人协同工作,来加速项目完成进度。 比如一个软件有100个form,分给100个人来写,每个人完成自己的Form.cs的编写之后,要在Mainform调用自己写的Form。 如果按照正常的Form form1 = new Form()这种写法来构造窗口的话,相当于每个人都要改动Mainfo

    2024年02月14日
    浏览(41)
  • C# 开发桌面应用简单介绍

    一. C#使用场景介绍 C#是微软公司发布的一种由C和C++衍生出来的面向对象的编程语言、运行于.NET Framework和.NET Core(完全开源,跨平台)之上的高级程序设计语言。 二. 开发流程 1. 创建项目:打开Visual Studio后右侧选择“创建新项目”,然后选择“C# Windows窗体应用”即可创建桌

    2024年02月05日
    浏览(55)
  • Visual Studio 2022安装与编译简单c语言以及C#语言(番外)

    Visual Studio官网 1、下载社区版即可。 2、下载得到安装文件,右键以管理员方式运行安装文件。 3、点击继续。 4、等待下载完成。 5、这里学习C选择 使用C++的桌面开发 。如果学习C#,需要 勾选.NET桌面开发 。 6、修改软件及附属文件的安装路径,之后点击右下角的安装即可。

    2023年04月09日
    浏览(42)
  • 【C#进阶】C# 反射

    序号 系列文章 11 【C#基础】C# 预处理器指令 12 【C#基础】C# 文件与IO 13 【C#进阶】C# 特性 ✋ 大家好,我是writer桑,本章为大家介绍 C# 中的 反射 。 反射 指的是程序可以 访问,检测和修改 它本身状态或行为的一种行为。 其中访问的目标包括程序集 1 、模块和类型对象等。可

    2024年03月15日
    浏览(49)
  • c# 类的方法链接例子

    在这个示例中,我们创建了一个名为 Calculator 的类,它具有一些简单的数学运算方法,如 Add()、Subtract()、Multiply() 和 Divide()。每个方法都会对内部的 result 成员变量进行相应的操作,并返回 Calculator 对象本身,以便实现方法链接。 在 Main() 方法中,我们首先创建了一个 Calcul

    2024年01月20日
    浏览(18)
  • C#反射的学习,反射的一些注意事项,反射的一些使用代码的实例

    本文档写的的是C#中的反射常用的方式(附带示例代码)以及在使用的时候的一些注意事项。 C#中的反射是一种强大的机制,它允许在运行时动态地检查、访问和操作程序的元数据、类型信息和对象。以下是C#中反射常用的技巧和使用方式: 获取类型信息:使用Type类可以获取

    2024年02月06日
    浏览(48)
  • C#反射

    反射(Reflection)是C#语言中一种非常有用的机制,它可以在运行时动态获取对象的类型信息并且进行相应的操作。反射是一种在.NET Framework中广泛使用的技术,它是实现上述特性的基础,非常重要。 使用反射可以让我们在运行时动态地获取对象的类型信息并进行相应的操作,

    2024年02月02日
    浏览(33)
  • C#基础--反射

    因为反射真的是无处不在,ORM、MVC、IOC、AOP、Attribute等等都会使用到反射。反射是程序员的快乐 Ilspy:逆向工程,可以吧DLL/Exe文件反编译回来 DLL/EXE 文件下包含Metadata和IL,IL是对标于C#代码的代码,属于中间语言,是标准的面向对象语言 而Metadata(元数据)是一个清单数据,

    2024年02月16日
    浏览(30)
  • C#的反射机制

    当谈到C#的反射机制时,它提供了一种 动态 地在运行时获取和操作类型信息的能力。通过反射,可以 在编译时未知的情况下 ,使用类型信息来创建对象、调用方法、访问属性和字段等。下面是一些反射机制的重要概念和用法: Type 类型:Type 类型表示在代码中定义的类型(

    2024年02月10日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包