C# 反射、使用场景

创建一个 Console 控制台应用程序,

1. 创建一个 Project

public class Project
    {
        public int ID { get; set; }

        public string ProjectName { get; set; }

        public DateTime CreateTime { get; set; }

        public DateTime? UpdateTime { get; set; }

        public string GetProject(int projectId, string projectName, DateTime createTime, DateTime? updateTime)
        {
            return string.Format("From Methods:ProjectId:{0}, Project name:{1}, CreateTime:{2}, UpdateTime:{3}",
                                        projectId, projectName, createTime, updateTime);
        }
    }

 

2. 使用反射动态给类(Project )的属性设置值、获取值

static void Main(string[] args)
        {
            Project project = new Project();
            Type projectType = project.GetType();
            object projectInstance = Activator.CreateInstance(projectType);

            //FieldInfo fieldID = projectType.GetField("ID");
            //fieldID.SetValue(projectInstance, 1);

            PropertyInfo propertyID = projectType.GetProperty("ID");
            propertyID.SetValue(projectInstance, 1);
            var projectId = propertyID.GetValue(projectInstance);

            PropertyInfo propertyName = projectType.GetProperty("ProjectName");
            propertyName.SetValue(projectInstance, "ProjectName001", null);
            var name = propertyName.GetValue(projectInstance);

            PropertyInfo propertyCreateTime = projectType.GetProperty("CreateTime");
            propertyCreateTime.SetValue(projectInstance, DateTime.Now, null);
            var createTime = propertyCreateTime.GetValue(projectInstance);

            PropertyInfo propertyUpdateTime = projectType.GetProperty("UpdateTime");
            propertyUpdateTime.SetValue(projectInstance, null, null);
            var updateTime = propertyUpdateTime.GetValue(projectInstance);

            Console.WriteLine("From Property:ProjectID:{0} Project name:{1}, CreateTime:{2}, UpdateTime:{3}",
                        propertyID, name, createTime, updateTime);

            MethodInfo method = projectType.GetMethod("GetProject");
            object[] parsArray = { 2, "Project00111", DateTime.Now.AddDays(10), null };
            var result = method.Invoke(projectInstance, parsArray);
            Console.WriteLine(result);
        }

 

转载于:https://www.cnblogs.com/leco/p/11119048.html

### C# 反射的常见使用场景和实际应用 #### 1. **动态加载程序集** 反射可以用于在运行时动态加载外部程序集(DLL),并通过检查其中的类型来创建实例或调用方法。这种能力常被用来构建插件架构,使应用程序能够支持第三方扩展而无需重新编译主程序。 以下是动态加载插件的一个示例[^5]: ```csharp using System; using System.IO; using System.Reflection; public interface IPlugin { void Execute(); } public class LoggerPlugin : IPlugin { public void Execute() { Console.WriteLine("Logging from plugin..."); } } class Program { static void Main() { string pluginPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Plugins", "Plugin.dll"); Assembly pluginAssembly = Assembly.LoadFrom(pluginPath); foreach (Type type in pluginAssembly.GetTypes()) { if (typeof(IPlugin).IsAssignableFrom(type) && !type.IsInterface) { IPlugin plugin = (IPlugin)Activator.CreateInstance(type); plugin.Execute(); } } } } ``` 此代码片段展示了如何通过 `Assembly.LoadFrom` 方法加载外部 DLL 并查找实现了特定接口的类,最后创建其实例并调用其方法。 --- #### 2. **序列化与反序列化** 反射可用于分析对象的结构并将它们转换为其他格式(如 JSON 或 XML)。同样,在接收这些格式的数据后,也可以利用反射将其还原成相应的对象实例。 例如,假设有一个简单的类定义如下: ```csharp public class Person { public string Name { get; set; } public int Age { get; set; } } ``` 可以通过反射遍历该类的所有公共属性,并将它们写入字典或其他数据存储介质中[^4]: ```csharp Person person = new Person { Name = "John Doe", Age = 30 }; Type type = typeof(Person); foreach (PropertyInfo property in type.GetProperties()) { object value = property.GetValue(person); Console.WriteLine($"{property.Name}: {value}"); } ``` 这有助于实现自定义的序列化逻辑而不依赖于框架内置的支持。 --- #### 3. **单元测试工具** 许多现代单元测试框架内部也大量运用了反射技术。比如 NUnit 和 MSTest 都会扫描标记有 `[Test]` 属性的方法,并自动执行这些测试案例。开发者只需专注于编写业务逻辑而非手动管理测试流程。 下面是一个简单例子演示如何发现所有标注为 Test 的方法并逐一调用[^2]: ```csharp [TestFixture] public class CalculatorTests { [Test] public void Add_ShouldReturnSumOfTwoNumbers() { Assert.AreEqual(7, new Calculator().Add(3, 4)); } [Test] public void Subtract_ShouldReturnDifferenceBetweenTwoNumbers() { Assert.AreEqual(-1, new Calculator().Subtract(3, 4)); } } // 执行器部分省略... ``` 在这里,测试引擎可能借助反射找到所有的 `[Test]` 标记函数然后依次触发它们完成验证过程。 --- #### 4. **ORM 映射** 关系型数据库的操作通常涉及表记录同内存中实体之间的相互转化工作。像 Entity Framework Core 这样的 ORM 库就广泛采用了反射手段简化这一复杂任务——即把 SQL 查询结果填充至对应的 .NET 对象里或者反过来生成更新语句提交给服务器端保存更改后的状态信息回去[^3]. 举个例子来说就是当查询某张客户资料表格的时候,EFCore 背后实际上是依靠反射去匹配列名跟目标模型类里的字段名称进而赋值过去形成最终返回的结果集合列表项之一罢了! --- #### 总结 综上所述,C# 中的反射不仅限于理论层面的知识点学习,更是在诸多领域有着极为广泛的实践价值。无论是为了增强系统的可维护性和开放度还是提升开发效率降低重复劳动量等方面均发挥着不可替代的作用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值