详解C#通过反射获取对象的几种方式比较

详解C# 通过反射获取对象的几种方式比较

概述

在 C# 中,有很多种方式获取对象,其中最常见的方式是使用 new 关键字实例化一个对象。但是在某些场景下,比如需要动态加载程序集或者需要通过配置文件指定对象类型等,就需要使用 C# 中的反射机制获取对象。

本文将详细讲解 C# 中使用反射机制获取对象的几种方式,并进行比较。

通过 Type 类型的静态方法获取对象

Type 类型在 C# 中代表一个类型,通过 Type 类型的静态方法可以获取一个类型的实例。有以下几种常见的方法:

1. GetType 方法

如果已知一个对象的实例,可以通过该对象的 GetType 方法获取该对象的类型。

var obj = new MyClass();
var type = obj.GetType();

2. typeof 运算符

如果已知一个类型的名称,可以通过 typeof 运算符获取该类型的 Type 实例。

var type = typeof(MyClass);

3. Type.GetType 方法

如果已知一个类型的名称和所在程序集的名称,可以通过 Type.GetType 方法获取该类型的 Type 实例。

var typeName = "MyNamespace.MyClass, MyAssembly";
var type = Type.GetType(typeName);

示例说明

class Person {
    public string Name { get; set; }
    public int Age { get; set; }
}

class Program {
    static void Main(string[] args) {
        // 获取类型实例
        var type = typeof(Person);

        // 创建实例
        var obj = Activator.CreateInstance(type);

        // 设置属性值
        type.GetProperty("Name").SetValue(obj, "张三");
        type.GetProperty("Age").SetValue(obj, 18);

        // 获取属性值
        var name = type.GetProperty("Name").GetValue(obj);
        var age = type.GetProperty("Age").GetValue(obj);

        Console.WriteLine($"Name: {name}, Age: {age}");
    }
}

通过 Assembly 类型加载程序集并获取对象

Assembly 类型代表一个程序集,通过该类型的静态方法可以加载程序集,进而获取该程序集中的类型实例。

示例说明

class Person {
    public string Name { get; set; }
    public int Age { get; set; }
}

class Program {
    static void Main(string[] args) {
        // 加载程序集
        var assembly = Assembly.Load("MyApplication");

        // 获得类型实例
        var type = assembly.GetType("MyApplication.Person");

        // 创建对象实例
        var obj = Activator.CreateInstance(type);

        // 设置属性值
        type.GetProperty("Name").SetValue(obj, "张三");
        type.GetProperty("Age").SetValue(obj, 18);

        // 获取属性值
        var name = type.GetProperty("Name").GetValue(obj);
        var age = type.GetProperty("Age").GetValue(obj);

        Console.WriteLine($"Name: {name}, Age: {age}");
    }
}

通过泛型方法获取对象

如果一个类型是泛型类型,那么可以使用泛型方法来获取该类型的实例。

示例说明

class Person {
    public string Name { get; set; }
    public int Age { get; set; }
}

class Program {
    static void Main(string[] args) {
        // 创建 List<Person> 实例
        var obj = CreateInstance<List<Person>>();

        Console.WriteLine($"Type: {obj.GetType().FullName}");
    }

    static T CreateInstance<T>() {
        return Activator.CreateInstance<T>();
    }
}

比较各种方式的优缺点

通过 Type 类型的静态方法获取对象的方式最为常见,它可以直接对类型进行操作,并且支持通过字符串方式来获取类型。但是该方式无法处理动态加载程序集的情况。

通过 Assembly 类型加载程序集并获取对象的方式可以处理动态加载程序集的情况,但是需要知道程序集的名称,而且需要编写较多的代码来获取类型和实例。

通过泛型方法获取对象的方式简单、直观,代码量较少,但是仅适用于泛型类型。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解C#通过反射获取对象的几种方式比较 - Python技术站

(0)
上一篇 2023年6月1日
下一篇 2023年6月1日

相关文章

  • asp.net UpdaeProgress的简单用法

    下面是 “ASP.NET UpdateProgress的简单用法”的完整攻略: 什么是ASP.NET UpdateProgress? ASP.NET UpdateProgress 允许在触发异步操作时显示进度指示器。 我们可以使用 UpdatePanel 控件或自己的自定义异步回发来合并 UpdateProgress 控件。 如何实现ASP.NET Upda…

    C# 2023年6月3日
    00
  • C# WinForm捕获未处理的异常实例解析

    C# WinForm捕获未处理的异常实例解析 在开发过程中,未处理的异常是一个常见但又容易被忽略的问题。当应用程序抛出未处理异常时,程序会崩溃并弹出一个错误对话框,这会给用户留下不好的印象。为了避免这种情况,我们需要捕获程序中的未处理异常并进行处理。 在本文中,我们将介绍如何在C# WinForm应用程序中捕获未处理异常。 捕获未处理异常 在C# WinFo…

    C# 2023年5月15日
    00
  • c# 基于wpf,开发OFD电子文档阅读器

    首先,我们需要明确一下,OFD是一种国家标准文件格式,需要使用OFD阅读器来查看。因此,我们打算基于c#和wpf框架来开发一个OFD电子文档阅读器。下面是开发步骤: 步骤一:创建一个WPF项目 我们需要创建一个新的WPF项目,然后添加所需的引用。这些引用可能包括以下内容: OFD解析库: 我们需要使用OFD解析库来解析OFD文件,然后在WPF中显示它们。因此…

    C# 2023年6月1日
    00
  • .net6 在中标麒麟下的安装

    尝试了下.net6在信创环境下的安装和部署 信创服务器,CPU:ARM64,操作系统:中标麒麟 v10,网络环境:政务网(无法连接外网) 1、下载 .net 6 SDK 6.0.408 Arm64二进制文件。https://dotnet.microsoft.com/zh-cn/download/dotnet/6.0 2、在服务器/home目录下创建两个新目录…

    C# 2023年4月22日
    00
  • C#算法之实现阿姆斯特朗数

    C#算法之实现阿姆斯特朗数 什么是阿姆斯特朗数? 阿姆斯特朗数是指一个n位数(n>1),它的所有位数上的数字的n次方之和等于它本身。例如:$153$是一个3位数,$153=1^3+5^3+3^3$ 实现方法 实现阿姆斯特朗数的方法比较简单,直接通过循环、取余、除法以及求幂等方式来计算即可。 首先定义一个变量$number$表示要计算的数。 计算此数的位…

    C# 2023年6月6日
    00
  • Winform窗体如何改变语言类型

    Winform 窗体的语言设置主要涉及以下两方面: 改变窗体语言的方式 处理措施 下面我们将会讲解如何进行以上两个方面设置。 改变窗体语言的方式 Winforms 默认依赖系统语言,在资源文件中保存语言翻译。有三种常见方式实现表单翻译: 静态文本资源文件 动态文本资源文件 使用第三方库 静态文本资源文件 使用静态文本资源文件时,我们在应用程序中会有一个包含预…

    C# 2023年6月6日
    00
  • 简单介绍SQL Server中的自旋锁

    SQL Server是一种关系型数据库管理系统,其管理和保护数据的并发访问性是非常重要的。为了满足这个需求,SQL Server使用了锁机制,其中自旋锁是其中一种类型的锁。 什么是自旋锁 自旋锁是一种轻量级的锁类型,它采用了忙等待的方式来解决锁冲突,并避免了线程的上下文切换。当一个线程尝试获得自旋锁时,如果锁没有被占用,该线程会立即获得锁,并继续执行。如果锁…

    C# 2023年6月6日
    00
  • .NET Core 离线生成 Tron 波场私钥和地址笔记

    NuGet 引入依赖库 PM> Install-Package Tron.Wallet.Net 随机生成私钥和对应的地址 using Tron.Wallet.Net; namespace ConsoleApp1 { internal class Program { static async Task Main(string[] args) { var …

    C# 2023年4月18日
    00
合作推广
合作推广
分享本页
返回顶部