C# 获取类的名,构造方法信息,字段信息,方法信息

在C#中使用反射获取对象的类型信息 在C#中,反射(Reflection)是一种强大的机制,允许在运行时获取有关程序集、模块和类型的元数据,并且能够动态地调用方法和访问字段。通过反射可以获取对象的类型信息,包括其属性、方法、事件等。请注意,反射通常比直接调用代码要慢,并且可能会绕过编译时的类型检查,因此在使用时需要谨慎。此外,反射可能会受到安全策略的限制,特别是在部分信任环境中。类是反射的核心,它提供了大量用于获取类型信息的方法。方法获取类型的所有方法信息。方法获取类型的所有属性信息。方法获取类型的所有构造函数信息。方法创建类型的实例。 阅读详情

(1)使用Assembly定义和加载程序集,加载在程序集清单中列出模块,以及从此程序集中查找类型并创建该类型的实例。

(2)使用Module了解包含模块的程序集以及模块中的类等,还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。

(3)使用ConstructorInfo了解构造函数的名称、参数、访问修饰符(如pulic 或private)和实现详细信息(如abstract或virtual)等。使用Type的GetConstructors或GetConstructor方法来调用特定的构造函数。

(4)使用MethodInfo了解方法的名称、返回类型、参数、访问修饰符(如pulic 或private)和实现详细信息(如abstract或virtual)等。使用Type的GetMethods或GetMethod方法来调用特定的方法。

(5)使用FiedInfo了解字段的名称、访问修饰符(如public或private)和实现详细信息(如static)等,并获取或设置字段值。

(6)使用EventInfo了解事件的名称、事件处理程序数据类型、自定义属性、声明类型和反射类型等,添加或移除事件处理程序。

(7)使用PropertyInfo了解属性的名称、数据类型、声明类型、反射类型和只读或可写状态等,获取或设置属性值。

(8)使用ParameterInfo了解参数的名称、数据类型、是输入参数还是输出参数,以及参数在方法签名中的位置等。

页面设计


按钮方法

        //获取类的信息
        private void button1_Click(object sender, EventArgs e)
        {
            richTextBox1.Text = "";
            string Tablename = "";//类名
            string[] name = null;//类的字段
            object[] value = null;//值
            string[] valueType = null;//值的类型
            int count = 0;//字段数量
            Class6 model = new Class6();
            Class5.GetClassData<Class6>(model, ref Tablename, ref name, ref value, ref valueType, ref count);
            richTextBox1.AppendText("类的名称:" + Tablename + "\t\n");
            richTextBox1.AppendText("类的字段名字,值类型,值" + "\t\n");
            if (name == null || value == null || valueType == null)
                return;
            for (int i = 0; i < count; i++)
            {
                richTextBox1.AppendText(name[i] + " , " + valueType[i] + " , " + value[i].ToString() + "\t\n");
            }
        }

        //获取类的方法
        private void button2_Click(object sender, EventArgs e)
        {
            richTextBox1.Text = "";
            string Tablename = "";//类名
            string[] Methodname = null;//方法名
            string[] Methoddata = null;//方法参数类型,参数名
            Class5.GetClassData<String>(ref Tablename, ref Methodname, ref Methoddata);
            richTextBox1.AppendText("类的名称:" + Tablename + "\t\n");
            if (Methodname == null || Methoddata == null)
                return;
            for (int i = 0; i < Methodname.Length; i++)
            {
                richTextBox1.AppendText("方法名称:" + Methodname[i] + Environment.NewLine);
                richTextBox1.AppendText("   参数:" + Methoddata[i] + Environment.NewLine);
            }
        }

        //获取类的构造方法
        private void button3_Click(object sender, EventArgs e)
        {
            richTextBox1.Text = "";
            string Tablename = "";//类名
            string Methodname = "";//构造方法名
            string[] Methoddata = null;//构造方法参数
            Class5.GetClassData<String>(ref Tablename, ref Methodname, ref Methoddata);
            richTextBox1.AppendText("类的名称:" + Tablename + "\t\n");
            richTextBox1.AppendText("构造方法名:" + Methodname + "\t\n");
            if (Methoddata == null)
                return;
            for(int i=0;i<Methoddata.Length;i++)
            {
                richTextBox1.AppendText("构造方法参数:" + Methoddata[i] + "\t\n");
            }
        }
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Text;

namespace Data
{
    public class Class5
    {
        /// <summary>
        /// 获取类的信息
        /// </summary>
        /// <typeparam name="T">泛型</typeparam>
        /// <param name="model">类</param>
        /// <param name="Tablename">表名</param>
        /// <param name="name">字段</param>
        /// <param name="value">值</param>
        /// <param name="valueType">值类型</param>
        /// <param name="count">字段个数</param>
        public static void GetClassData<T>(T model, ref string Tablename, ref string[] name, ref object[] value, ref string[] valueType, ref int count)
        {
            Tablename = "";
            if (model == null)
                return;
            Type type = model.GetType();
            Tablename = type.Name;//类名
            #region 获取类的信息
            System.Reflection.PropertyInfo[] properties = model.GetType().GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public);
            count = properties.Length;//元素个数
            if (count <= 0)
            {
                return;
            }
            name = new string[count];//字段名
            value = new object[count];//值
            valueType = new string[count];//值类型
            int i = 0;
            foreach (System.Reflection.PropertyInfo item in properties)
            {
                name[i] = item.Name;
                value[i] = item.GetValue(model, null);
                valueType[i] = item.PropertyType.Name.ToString();
                i++;
            }
            #endregion
        }

        /// <summary>
        /// 获取类的信息
        /// </summary>
        /// <typeparam name="T">泛型</typeparam>
        /// <param name="Tablename">表名</param>
        /// <param name="Methodname">方法名string[]</param>
        /// <param name="Methoddata">方法参数string[]  参数1|参数2....</param>
        public static void GetClassData<T>(ref string Tablename, ref string[] Methodname, ref string[] Methoddata)
        {
            Tablename = "";
            Type type = typeof(T);
            Tablename = type.Name;//类名
            int count = type.GetMethods().Length;//方法数量
            if (count <= 0)
                return;
            Methodname = new string[count];
            Methoddata = new string[count];
            int i = 0;
            int datacount = 0;
            foreach (MethodInfo meth in type.GetMethods())
            {
                Methodname[i] = meth.Name;
                StringBuilder sb = new StringBuilder();
                datacount = meth.GetParameters().Length;
                if (datacount > 0)
                {
                    foreach (ParameterInfo data in meth.GetParameters())
                    {
                        //参数类型  参数名
                        sb.Append(data.ParameterType+","+data.Name + "|");
                    }
                    string str=sb.ToString();
                    int strlen=str.Length;
                    Methoddata[i] = str.Substring(0, strlen - 1);
                }
                else
                {
                    Methoddata[i] = "";
                }
                i++;
                
            }

        }
    
        /// <summary>
        /// 获取类的信息
        /// </summary>
        /// <typeparam name="T">泛型</typeparam>
        /// <param name="Tablename">表名</param>
        /// <param name="Methodname">构造方法名 构造方法名1|构造方法名2....</param>
        /// <param name="Methoddata">构造方法参数 参数类型1,参数1|参数类型2,参数2....</param>
        public static void GetClassData<T>(ref string Tablename, ref string Methodname, ref string[] Methoddata)
        {
            Tablename = "";
            Type type = typeof(T);
            Tablename = type.Name;
            StringBuilder sb = new StringBuilder();
            StringBuilder msb = new StringBuilder();
            int i = 0;
            int count = type.GetConstructors().Length;
            if (count <= 0)
                return;
            Methoddata = new string[count];
            int datacount = 0;
            foreach(ConstructorInfo info in type.GetConstructors())
            {
                msb.Append(info.Name + "|");
                datacount = info.GetParameters().Length;
                if (datacount > 0)
                {
                    foreach (ParameterInfo data in info.GetParameters())
                    {
                        sb.Append(data.ParameterType+","+data.Name + "|");
                    }
                    string str = sb.ToString();
                    int strlen = str.Length;
                    Methoddata[i] = str.Substring(0, strlen - 1);
                }
                else
                {
                    Methoddata[i] = "";
                }
                i++;
            }
            string mstr = msb.ToString();
            int mstrlen = mstr.Length;
            Methodname = mstr.Substring(0, mstrlen - 1);
        }
    }
}

测试类

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;

namespace Data
{
    public class Class6
    {
        /// <summary>
        /// 用于类的获取
        /// </summary>
        public Class6()
        {
            str = Guid.NewGuid().ToString("N");
            int10 = 10;
            bools = false;
            Time = DateTime.Now;
            doubles = 1000.02;
            bytes = 01;
            decimals = 10.0M;
            floats = 2.33F;
        }

        /// <summary>
        /// String
        /// </summary>
        [DisplayName("String")]
        public string str { get; set; }

        /// <summary>
        /// int
        /// </summary>
        [DisplayName("int")]
        public int int10 { get; set; }

        /// <summary>
        /// bool
        /// </summary>
        [DisplayName("bool")]
        public bool bools { get; set; }

        /// <summary>
        /// DateTime
        /// </summary>
        [DisplayName("DateTime")]
        public DateTime Time { get; set; }

        /// <summary>
        /// Double
        /// </summary>
        [DisplayName("Double")]
        public double doubles { get; set; }

        /// <summary>
        /// Byte
        /// </summary>
        [DisplayName("Byte")]
        public byte bytes { get; set; }

        /// <summary>
        /// decimal
        /// </summary>
        [DisplayName("decimal")]
        public decimal decimals { get; set; }

        /// <summary>
        /// float
        /// </summary>
        [DisplayName("float")]
        public float floats { get; set; }
    }
}
C#类的成员 类的定义包括类头和类体(类的成员)两部分。 类头就是使用class关键字定义的类名, 类体(类的成员)是用一对大括号{}括起来的,在类体中主要定义类的成员,类的成员包括字段、属性、方法(函数)、事件等。 字段。 字段是程序开发中常见的常量或者变量,它是类的一个构成部分,使得类可以封装数据。 看上面的代码就知道字段是什么了。 2.属性属性经常与字段连用,属性的作用是对字段赋值时加以限制。定义属性需要类型和名字。属性包含get块和set块。访问属性时,当取得属性值时,会调用get块,当设. 阅读详情

相关推荐

C#构造方法的使用

C#构造方法的使用,构造方法又叫构造函数,它是一种特殊的方法,因为构造方法本身没有返回值,并且通常是public访问类型,方法的名称必须与类名相同。构造方法在类实例创建之前执行,用来初始化对象。所有的类都有构造方法,如果没有定义的构造方法,系统默认生成空的构造方法;如果一个类中定义了有参构造函数,实例化时需要调用无参构造函数,这时我们就必须定义一个显式无参数构造函数,否则运行会报错。...

torino999的博客 4028

C#高级知识 反射以及特性

反射 什么是元数据: 什么是反射: 核心类:Type MyMethod myMethod = new MyMethod(); Type type = myMethod.GetType(); Console.WriteLine("类名:" + type.Name); Console.WriteLine("命名空间:" + type.Namespace); Console.WriteLi...

qq_42555291的博客 466

【C#面向对象】第五课——类的继承、调用父类的构造方法、继承的特性

知识点:理解继承的概念 、 掌握在程序中实现继承、 掌握 base 和 protected 关键字 、掌握如何调用父类构造方法 、 掌握继承的特性 1、理解继承 面向对象有三大特性:封装、继承和多态。我们学习过封装,封装是信息隐藏,我们定义类的过程就是对数据的一种封装,今天我们将重点讨论继承。 继承反映的是类之间的层次关系,生活中就有很多继承的例子,如:我们知道汽车有型号、颜色、排量、油耗等属性,有行驶和刹车方法。而公交车是汽车的一种,除了有汽车基本的属性...

王迪 5956

C#获取某个class类的字段、属性、方法 详解(亲测有用)

C#获取某个class类的字段、属性、方法 详解(亲测有用)

qq_39858177的博客 2912

Matlab2021a破解版安装与激活实战教程(含详细步骤截图)

本文详细介绍了MATLAB R2021a的正版安装流程与核心功能优化,包括系统要求、安装步骤、性能调优及深度学习工具箱的应用。通过实战教程和代码示例,帮助用户高效搭建开发环境并掌握关键技术,特别适合工程计算与科学研究的专业人士。

vvv99的博客 461

QT使用openssl实现RSA加解密

使用openssl生成公私钥,随后用QT对相应的信息进行RSA加解密

weixin_42098322的博客 3867

C#获取实体类字段信息PropertyInfo,字段名称,字段值

【代码】C#获取实体类字段信息PropertyInfo,字段名称,字段值。

分享一些简单实例 1391

Excel插件开发实战:从零封装一个带自定义Ribbon的.xlam工具包

本文详细介绍了如何从零开发一个带自定义Ribbon的Excel插件.xlam工具包。通过VBA和XML技术,读者将学习到插件架构设计、Ribbon界面定制、模块化开发以及企业级部署策略,帮助提升Excel自动化办公效率。

weixin_42531128的博客 516

gettype获取类名_C#/.NET应用程序编程开发中如何获取当前类的类名?

问题描述比如,在C#/.NET应用程序编程开发中有一个名为Customer的类,其中有一个方法GetClassName()需要获取当前类的类名,应该如何实现呢?Customer.cs:public class Customer{public int Id {get;set;}public string GetClassName(){string className ="";// get class...

weixin_36118025的博客 1118

HyperMesh 2025新功能尝鲜:用Volume Tetramesh一键生成工业级四面体网格

HyperMesh 2025推出的Volume Tetramesh功能,通过“体到体”的全新范式,实现了工业级四面体网格的一键生成。该功能利用Proximity与Curvature参数智能识别并加密几何特征,将工程师从繁琐的几何清理和表面网格划分中解放出来,在保证网格质量的同时,显著提升了前处理效率,尤其适用于发动机缸体等复杂模型的仿真分析。

weixin_29229055的博客 477

深入解析:如何基于开源OpENer开发EtherNet/IP从站服务

通过OpENer开源库,开发者可以快速实现符合ODVA规范的EtherNet/IP从站设备,降低开发成本并提高系统灵活性。本文详细介绍了EtherNet/IP协议原理、OpENer库的特点与优缺点,以及二次开发的完整流程。通过遵循本文提供的指南,开发者可以成功构建出工业级的EtherNet/IP通信设备。

极地星辰 2999

C#采用反射获取字段的名字和注释自动添加到表格显示和修改

C# 自动编程,自动获取字段的名称和值,加载到表中显示、修改、保存

星河队长 2479

云卓遥控器+DIY高清摄像机的方案(完美接入原系统)

发云卓H16 1080P数图控三合一10公里 其中它月

fgh00000的博客 1万+

C#中类的字段,方法和属性的区别

前言:本博文讲解了C#中类的字段,方法和属性的区别,通过一个理论知识与例子相结合,进行理解,最后总结了一下自己对这块的一些理解。 文章目录一、概念二、示例三、总结 一、概念 类的字段准确地说应该是类的数据成员,其定义是:用于存储类和类的实例相关数据的变量。 方法就是类的函数成员,是一个为实现类的某一个特定功能的函数。因此也称为类的方法。 属性是一个代表类的实例或类中的一个数据项的函数成员。从定义可以看出,属性是类的一个函数成员或者说是方法。对类的属性的设定和获取可以用两个访问器set和get来实现。 二

路虽远,行则必至! 4706

C++笔记之emplace_back(),push_back()性能比较i++ 、 ++i

操作是否需要临时对象/拷贝性能需要(构造临时对象)较慢不需要(直接构造)较快i++需要(保存旧值)对于内置类型无影响,但对于自定义类型(如迭代器、大对象)会有拷贝开销++i不需要相对更快(尤其是自定义类型)都存在"是否需要额外的临时对象/拷贝"这一性能差异点和++i都是更高效的版本(避免临时对象/拷贝)和i++都可能产生额外的临时对象(前者构造临时对象,后者保存旧值)对于内置类型(如int),i++和++i性能几乎没有差异(编译器会优化);但对于自定义类型(尤其是迭代器等重量级对象),

小勇博客 98

ConvNeXt 系列改进:引入大核注意力(LKA)替换 7×7 深度卷积,涨点 2.1%

LSKA替换7×7深度卷积,在ImageNet分类任务上实现2.1%的显著提升,参数量仅增加1M。LSKA的四层1D分解将计算复杂度从O(k²)降至O(k),21×21大核的计算量仅相当于原版7×7的1.7倍,实现了感受野与计算成本的完美平衡。部署友好度极高:LSKA模块在TensorRT FP16量化后延迟仅1.2ms,精度损失<0.1%,远优于Transformer类模型。下游任务全面领先。

ZXSXJ的博客 700

面向对象的C#语言——类、字段、方法

面向对象的C#语言——类、字段、方法 现实中的事物抽象为类 类(Class)最基本的要素是:字段(field)—变量,方法(method)—函数. 例: Person(类): _ 字段:age,name _ 方法:GetInfo,IsOlderThan,SayHello 一、定义类中的字段与方法 定义一个Person(人)类: Class Person(){ //字段—变量 public St...

Mr_Singto的博客 813

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

C# 字段、属性,构造方法相关 及类中的this、GC垃圾回收

1.对字段进行封装 private string username;//定义私有字段 //使用字段时通过属性来调用,属性本身设置为私有,更安全 public string UserName { get{return username;} //返回字段值 set{username=value;} //通过value给字段赋值 } //C#3.0以后简写为 public stri...

qq_41609957的博客 457

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C#无参构造方法

/* *构造方法的作用:为属性赋值 *如果没有显示定义构造方法,则会有一个默认的无参的构造方法 *如果显示定义了构造方法,则没有默认构造方法 *只能用new 方法名()的形式调用构造方法 *构造方法通常声明为public *构造方法没有返回值类型 *构造方法名必须与类名相同 */ Child.cs using System; using System.Collection...

zs1342084776的博客 7028

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

学习笔记之C#类的构造方法

一、类的实例化 Student zsStudent = new Student(); 在等号前,Student为类名, zsStudent为实例名;Student zsStudent相当于定义了一个变量; 等号后,new才是实实在在为学生对象创建并分配内存空间;Student()是在调用构造方法。 经典示例: Vector x,y; x = new vector(); x.Value

J_adam的专栏 1061

【C#】面对对象和类、构造方法及命名空间

一、面向对象 1、什么是面向对象? 面向对象是一种思想,面向对象是将功能等通过对象来实现,将功能封装进对象之中,让对象去实现具体的细节,在面向对象中,将数据作为第一位,而方法或者说是算法作为其次,这是对数据的一种优化,操作起来更加方便,简化了过程。 2、为什么要用面向对象? 无论是在C#还是在VB中,都反复提及到了面向对象,那么为什么要使用面向对象呢?也就是说面向对象有哪些好处呢? 面向...

Phoneix的博客 807

C#入门-Person类

又是新的一周,小白由来学习C#了,今天要学的内容是C#的面向对象的特性-类与继承,我们直接看题,然后说明其中的知识点: 编写一个C#程序,定义: 一个表示人的类Person,包括字段“姓名”“性别”,方法“获得性别”,属性“年龄”,限定“年龄”的取值范围为0~120; 一个表示学生的类Student,继承自Person,包括字段“学号”“班号”;方法“获得学号”“获得班号”。 这里我先...

MARS_098的博客 1万+

C# 类的成员——字段、方法、构造函数和属性

本博文为半摘记性质,收集整理自菜鸟教程、微软C#文档及其他互联网资料 —— 类的成员:主讲字段、方法和属性 字段又称为“成员变量”,一般用在一个类内部做数据交互使用,通常使用private修饰; 方法是把一些相关的语句组织在一起,用来执行一个任务的语句块; 类的 构造函数 是类的一个特殊的成员函数,是一种特殊的方法,主要用来在创建对象时初始化对象; 属性属于高级概念,在OOP(面向对象)中,主要使用属性来描述对象的静态特征。

追求。 4738

C#构造方法

一:定义 构造方法是类中的一个特殊成员,它能够在实例化对象的同时对属性(字段)进行赋值。我们在学习get/set属性,构造方法,索引器时可以对比学习;因为这三种方法的作用均是对类的成员进行访问和操作,俗话说的:条条大道通罗马。 1:判断是否为构造方法 —方法名与类名相同 —在方法名的前面没有返回值类型的声明 —在方法内部不能使用return语句进行返回。 如下: publi...

Make a little progress every day! 2149

C#获取MySQL数据库中的所有的表名和字段名及字段的数据类型

获取表名          public bool GetTableName()         {             string sql = "show tables;";             MySqlCommand cmd = new MySqlCommand(sql, conn);             MySqlDataReader reader = null;

sunmk 1万+

C# 类 字段 方法

类 字段 方法

钢铁男儿 502
上一篇: C# 通过类或者数据表名获取主键字段(没有外键)
下一篇: C# DataTable转化为 IList IList&lt;DataRow&gt; 转化为 IList&lt;T&gt; DataRow转化为model IList转化List
浅笑_微梦
博客等级 码龄9年 106粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值