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日
    浏览(41)
  • C#利用自定义特性以及反射,来提大型项目的开发的效率

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

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

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

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

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

    2023年04月09日
    浏览(44)
  • 【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日
    浏览(23)
  • C#反射的学习,反射的一些注意事项,反射的一些使用代码的实例

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

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

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

    2024年02月16日
    浏览(31)
  • C#编程-属性和反射

    属性是将元数据信息和行为添加到应用程序代码中的简单技术。属性是允许您将声明信息添加到程序的元素。此声明信息在运行时用途广泛,可使用应用程序开发工具在设计时使用。 对象是由其属性值描述的。例如,汽车可以使用它的构造、型号或颜色来描述。类似地,C#程

    2024年01月18日
    浏览(41)
  • c#之反射详解

    说到反射,就不得不说一下C#编译运行过程: 首先我们在VS点击编译的时候,就会将C#源代码编译成程序集 程序集以可执行文件 (.exe) 或动态链接库文件 (.dll) 的形式实现 程序集中包含有Microsoft 中间语言 (MSIL) 和必需的元数据。 元数据存储以下信息: 程序集的说明:标识(名

    2024年02月10日
    浏览(38)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包