C#利用反射获取类文件以及其中的方法属性并获取类及方法上的特性

更新时间:2023-08-03 12:12:10 阅读: 评论:0

C#利⽤反射获取类⽂件以及其中的⽅法属性并获取类及
⽅法上的特性
了解C#特性类并声明我们⾃⼰的特性类【AttributeTest】代码如下
using System;
namespace AttributeTest
{
/* 特性说明
特性本质是⼀个继承和使⽤了系统基类的"类",⽤以将元数据或声明信息与代码(程序集、类型、⽅法、属性等)相关联。特性与程序实体关联后,即可在运⾏时使⽤名为“反射”的技术查询特性。
官⽅介绍的很详细,我们就⼀起来了解⼀下它的⽤法。
特性具有以下属性:
1.特性可向程序中添加元数据。元数据是有关在程序中定义的类型的信息。所有的 程序集都包含指定的⼀组元数据,
这些元数据描述在程序集中定义的类型和类型成员。可以添加⾃定义特性,以指定所需的任何附加信息。
2.可以将⼀个或多个特性应⽤到整个程序集、模块或较⼩的程序元素(如类和属性)。
3.特性可以与⽅法和属性相同的⽅式接受参数。
4.程序可以使⽤反射检查⾃⼰的元数据或其他程序内的元数据。
*/
#region 声明⼀个作⽤于成员⽅法的特性
镜头看世界
//1.第⼀步继承⾃定义属性的基类 Attribute
//2.第⼆步指定我们⾃定义特性类的⼀些属性,⽤系系统特性指定
// AttributeTargets:指定为程序中的何种成员设置属性可写多个例: AttributeTargets.Class|AttributeTargets.Method
//    AllowMultiple:如果允许为⼀个实例多次指定该特性,则为 true;否则为 fal。默认为 fal。
//        Inherited:如果该属性可由派⽣类和重写成员继承,则为 true,否则为 fal。默认为 true。
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class MethodAttribute : Attribute
{
/// <summary>
/// ⽅法名称
/// </summary>
public string MethodName { t; get; }
/// <summary>
/// ⽅法描述
/// </summary>
public string MethodDesc { t; get; }
/// <summary>
/// ⽅法描述特性
/// </summary>
/// <param name="methodName">⽅法名称</param>
/// <param name="methodDescription">⽅法描述</param>
public MethodAttribute(string methodName, string methodDescription)
{
MethodName = methodName;
MethodDesc = methodDescription;
}
}
}
#endregion达贝妮
#region 声明⼀个作⽤于类的特性
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]//第⼀步    public class ClassAttribute : Attribute//第⼆步
{
string ClassName { t; get; }
string ClassDesc { t; get; }
public ClassAttribute(string className, string classDesc)
{
ClassName = className;
ClassDesc = classDesc;
}
//重写当前特性的ToString()⽅法
public override string ToString()
{
return string.Format(@"当前类特性名:[ClassAttribute]
特性成员1:ClassName-->值:{0},
特性成员2:ClassDesc-->值:{1}", ClassName, ClassDesc);        }
}
#endregion新疆旅游景点大全
}
编写使⽤了⾃定义特性类的类及成员 代码如下
using System;
namespace AttributeTest
{
#region 为⼀个类编写成员并使⽤⾃定义的类特性以及成员特性
[ClassAttribute("TestClass", "测试反射及特性")]
class TestClass
{
string _StrTest = "测试信息";
float _Version = 1.1F;
float Version { t { _Version = value; } get { return _Version; } }
string StrTest { t { _StrTest = value; } get { return _StrTest; } }
public TestClass()
{
}
TestClass(string strTest,float version)
{
StrTest = strTest;
Version = version;
}
#region ⽤于测试反射执⾏私有⾮静态⽅法(带有⾃定义⽅法成员特性)---> 成员1
[MethodAttribute("Demo", "测试特性类⽰例⽅法Demo")]
string Demo(string param)
{
return string.Format("\r\n1.⽅法调⽤信息:\r\n①调⽤⽅法:{0}\r\n②传递参数:{1}", "Demo", param);        }
#endregion
#region ⽤于测试反射执⾏公开静态⽅法(带有⾃定义⽅法成员特性)---> 成员2
[MethodAttribute("Demo1", "测试特性类⽰例⽅法Demo1")]
public static string Demo1(string param)
{
return string.Format("\r\n1.⽅法调⽤信息:\r\n①调⽤⽅法:{0}\r\n②传递参数:{1}", "Demo1", param);        }
#endregion
public void ConsoleMsg(string strMsg)
{
Console.WriteLine("\r\nMsg:"+strMsg);
}
}
#endregion
}
通过反射机制 获取所编写类⽂件及其成员 和其特性 代码如下
using System;
using System.Reflection;
namespace AttributeTest
{
class Program
{
谢道韫#region 存储 TestClass类反射信息的字段
static Type clazz;
static Type clazz1;
static Type clazz2;
static Type clazz3;
#endregion
static void Main(string[] args)
{
Program program = new Program();
program.GetReflectInfoByClass();              //得到TestClass类的反射
program.ReflectInvokePrivateNonStaticMethod();//反射的⽅式调⽤TestClass类中私有⾮静态⽅法并输出其⽅法上的特性            program.ReflectInvokePublicStaticMethod();    //反射的⽅式调⽤TestClass类中公开静态⽅法并输出其⽅法上的特性
program.GetAllField();                        //获取TestClass类中的字段
program.GetAllProp();                        //获取TestClass类中的属性
监督执纪问责program.ReflectGetAttributeByClass();        //获取TestClass类上的特性
Console.ReadKey();
}
#region 通过【类名】和【类的限定名】和【程序集(Asmbly)】取得类的【反射信息】
//通过类名和类的限定名取得类的反射信息
void GetReflectInfoByClass()
{
//以下三种种⽅式得到当前类的反射信息得到的结果都⼀样
//1.通过TestClass类名得到类反射信息
clazz = typeof(TestClass);
clazz1 = new TestClass().GetType();
//2.通过TestClass类的限定名得到其反射信息
clazz2 = Type.GetType("AttributeTest.TestClass");
clazz2 = Type.GetType("AttributeTest.TestClass");
//3.通过【程序集.dll】或【可执⾏⽂件.exe】反射TestClass
Asmbly asmbly = Asmbly.LoadFile(@"F:\Projects_C#\UpLoadData_prj\AttributeTest\bin\Debu
");            clazz3 = asmbly.GetType("AttributeTest.TestClass");
//判别得到的反射是否⼀致
if (clazz.Equals(clazz2) && clazz2.Equals(clazz3))
Console.WriteLine("\r\nclazz==clazz1==clazz2==clazz3\r\n");
//直接利⽤程序集和类的完全限定名创建TestClass对象调其⽅法
var obj = asmbly.CreateInstance("AttributeTest.TestClass");
if (obj is TestClass)
{
TestClass tc = obj as TestClass;
tc.ConsoleMsg("反射会破坏访问权限");
枸杞子的功效和作用
}
}
#endregion
#region ⽤反射的⽅式调⽤【TestClass类】私有⾮静态⽅法
/// <summary>
/// ⽤反射的⽅式调⽤TestClass类中私有⾮静态⽅法
/// </summary>
void ReflectInvokePrivateNonStaticMethod()
{
//Demo为私有⽅法指定在类中搜索私有成员|实例成员
BindingFlags bindingFlags = BindingFlags.NonPublic | BindingFlags.Instance;
//反射私有⽅法需要指定 BindingFlags.NonPublic
var Demo = clazz1.GetMethod("Demo", bindingFlags);//私有⾮静态
#region 调⽤私有⾮静态⽅法[Demo]
//1.实例化[Demo]⽅法所在类, 第⼆个参数默认fal:不可访问私有构造函数  true:则可访问类中私有构造函数
object o = Activator.CreateInstance(clazz2, true);
//2.通过类的实例调⽤⽅法[Demo] (含⼀个参数)
var returns = Demo.Invoke(o, new object[] { "ReflectionTest" });
Console.Write(returns);
#endregion
//输出⽅法上的特性信息
ReflectGetAttributeByMethod(Demo);
Console.Write("\r\n");
}
#endregion姜荷花
#region ⽤反射的⽅式调⽤【TestClass类】中公开静态⽅法
/// <summary>
/// ⽤反射的⽅式调⽤TestClass类中公开静态⽅法
/// </summary>
void ReflectInvokePublicStaticMethod()
{
#region 调⽤公开静态⽅法
//1.Demo1为公开访问权限,BindingFlags默认为 Instance、Public
var Demo1 = clazz2.GetMethod("Demo1");
/
/2.Demo1为静态⽅法调⽤不需要实例化其所在类
var returns = Demo1.Invoke(clazz, new object[] { "ReflectionTest1" });
//输出⽅法返回值
Console.Write(returns);
#endregion
//通过反射信息得到⽅法上的特性信息喜欢你粤语谐音

本文发布于:2023-08-03 12:12:10,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1106543.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:特性   反射   程序   信息   成员   定义
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图