C# Type类中Name、FullName、Namespace、AssemblyQualifiedName的区别

ops/2025/3/18 16:35:01/

总目录


前言

在C#中,Type 类提供了多种属性来获取类型的相关信息。以下是 NameFullNameNamespaceAssemblyQualifiedName 这几个属性的区别和具体用途。


一、获取各名称属性示例

namespace ReflectionDemo
{public class User { }internal class Program{static void Main(string[] args){var type = typeof(User);Console.WriteLine($"{"Name".PadRight(24)}{type.Name}");Console.WriteLine($"{"FullName".PadRight(24)}{type.FullName}");Console.WriteLine($"{"Namespace".PadRight(24)}{type.Namespace}");Console.WriteLine($"{"AssemblyQualifiedName".PadRight(24)}{type.AssemblyQualifiedName}");}}
}

运行结果:

Name                    :User
FullName                :ReflectionDemo.User
Namespace               :ReflectionDemo
AssemblyQualifiedName   :ReflectionDemo.User, ReflectionDemo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null

二、分析属性区别

1. Name 属性

  • 定义: 获取类型的简单名称,即不包含命名空间的类型名称。
  • 示例: 对于一个名为 ReflectionDemo.User 的类,Name 属性将返回 "User"
  • 用途: 当你需要获取类型不带命名空间的名称时使用。

2. FullName属性

  • 定义: 获取该类型的完全限定名称,包括其命名空间,但不包括程序集。
  • 示例: 对于一个名为ReflectionDemo.User 的类,FullName 属性将返回 ReflectionDemo.User
  • 用途: 当你需要唯一标识一个类型(在其所在的程序集中)而不关心其所属程序集时使用。

3. Namespace属性

  • 定义: 获取声明该类型的命名空间。
  • 示例: 对于一个名为ReflectionDemo.User 的类,Namespace 属性将返回 "ReflectionDemo"
  • 用途: 当你需要知道某个类型属于哪个命名空间时使用,这对于避免命名冲突非常有用。

4. AssemblyQualifiedName属性

  • 定义: 获取类型的程序集限定名,包括命名空间、程序集名称、版本号、文化信息和公钥标记等。这是类型在程序集中的唯一标识。
  • 示例: 对于一个名为 ReflectionDemo.User 且位于 ReflectionDemo 程序集中的类,
    AssemblyQualifiedName 会返回类似 ReflectionDemo.User, ReflectionDemo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null 的字符串。
  • 用途: 当你需要加载类型或进行反射操作时,通常需要使用 AssemblyQualifiedName 来精确指定类型的位置和版本信息。这对于跨程序集识别类型特别重要。

三、AssemblyQualifiedName 详解

1. 定义

AssemblyQualifiedName 是类型的程序集限定名,是一个字符串,这是类型在程序集中的唯一标识。它不仅包含类型的完全限定名(命名空间 + 类型名称),还包含了程序集的详细信息(如名称、版本、文化、公钥令牌等)。这使得 AssemblyQualifiedName 可以在不同程序集中准确地定位和加载特定类型。

2. 格式

AssemblyQualifiedName 的格式如下:

Namespace.TypeName, AssemblyName, Version=Major.Minor.Build.Revision, Culture=culture, PublicKeyToken=publicKeyToken
  • Namespace.TypeName: 类型的完全限定名(包括命名空间)。
  • AssemblyName: 程序集的名称(不包括扩展名)。
  • Version: 程序集的版本号(例如:1.0.0.0)。
  • Culture: 程序集的文化信息(通常是 “neutral”,除非程序集是特定文化的)。
  • PublicKeyToken: 程序集的公钥令牌,用于验证程序集的发布者身份。

示例MyNamespace.MyClass, MyLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=abcdef1234567890

3. 类型的程序集限定名获取方式

  • 通过Type 实例的 AssemblyQualifiedName属性获取

    type.AssemblyQualifiedName
    
  • 通过手动按格式组装定义获取

    string assemblyQualifiedName = "MyNamespace.MyClass, MyLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=abcdef1234567890";
    

4. 程序集的强名称和弱名称

1)强名称(Strong Name)

强名称是一个程序集的唯一标识符,由以下部分组成:

  • 简单名称:程序集的文件名(不包括扩展名)。
  • 版本号:程序集的版本信息(例如:1.0.0.0)。
  • 文化标识:通常为 “neutral”,除非程序集是特定于某种文化的。
  • 公钥/令牌:用于验证程序集的发布者身份。公钥令牌是公钥的缩写形式。

强名称确保了程序集的唯一性,并且允许 .NET 运行时加载正确的程序集版本,防止不同版本之间的冲突。强名称通过使用私钥签名生成,并可以通过公钥令牌进行验证。

2)弱名称(Weak Name)

弱名称指的是没有强名称签名的程序集。这种程序集没有版本控制和唯一性的保障,因此不能保证跨应用程序的一致性和安全性。弱名称的程序集仅包含其文件名和可能的版本信息,但不包含公钥令牌和文化标识等强名称元素

我们创建的一个类库,如果没有特殊操作都属于是是弱名称程序集

5. AssemblyQualifiedName 和程序集的强名称和弱名称的关系

1) 强名称程序集

  • 使用 AssemblyQualifiedName 时,如果程序集具有强名称,则必须包含版本、文化、公钥令牌等信息。
  • 示例:MyNamespace.MyClass, MyLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=abcdef1234567890
  • 这种情况下,AssemblyQualifiedName 可以唯一标识并加载特定版本的程序集中的类型。

2)弱名称程序集

  • 如果程序集没有强名称,则 AssemblyQualifiedName 中可以省略版本、文化和公钥令牌等信息。
  • 示例:MyNamespace.MyClass, MyLibrary
  • 在这种情况下,程序集的唯一性依赖于其文件名和路径,而不是强名称提供的额外标识信息。

6. AssemblyQualifiedName 的应用

1)应用

AssemblyQualifiedName 作为 Type.GetType 方法的参数,动态加载指定类型。

// 类型的程序集限定名 - 强名称
string assemblyQualifiedName1 = "MyNamespace.MyClass, MyLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=abcdef1234567890";           
var type = Type.GetType(assemblyQualifiedName1);// 类型的程序集限定名 - 弱名称
string assemblyQualifiedName2 = "MyNamespace.MyClass, MyLibrary";
type = Type.GetType(assemblyQualifiedName2);

2)示例代码

AssemblyQualifiedName 在实际应用中主要用于通过反射加载类型,尤其是在跨程序集的情况下。以下是一个具体的案例,展示如何使用 AssemblyQualifiedName 来动态加载类型并创建实例。

案例背景

假设你有两个项目:一个类库(MyLibrary.dll)和一个控制台应用程序(MyConsoleApp.exe)。类库中定义了一个名为 MyNamespace.MyClass 的类,并且你想在控制台应用程序中动态加载这个类并调用其方法。

步骤说明
  1. 定义类库项目 (MyLibrary.dll)
  2. 编写控制台应用程序 (MyConsoleApp.exe) 使用 AssemblyQualifiedName 动态加载并使用类库中的类型。
类库代码 (MyLibrary.dll)

首先,我们定义一个简单的类库项目,包含一个类 MyClass

// MyLibrary/MyClass.cs
namespace MyNamespace
{public class MyClass{public void DisplayMessage(){Console.WriteLine("Hello from MyClass!");}}
}
控制台应用程序代码 (MyConsoleApp.exe)

接下来,在控制台应用程序中,我们将使用 AssemblyQualifiedName 来动态加载 MyClass 并调用其方法。

using System;
using System.Reflection;class Program
{static void Main(string[] args){// 获取 MyLibrary 中 MyClass 的 AssemblyQualifiedNamestring assemblyQualifiedName = "MyNamespace.MyClass, MyLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null";try{// 加载包含目标类型的程序集Type myType = Type.GetType(assemblyQualifiedName);if (myType == null){Console.WriteLine("Failed to load type.");return;}// 创建目标类型的实例object myInstance = Activator.CreateInstance(myType);// 调用 DisplayMessage 方法MethodInfo methodInfo = myType.GetMethod("DisplayMessage");if (methodInfo != null){methodInfo.Invoke(myInstance, null);}else{Console.WriteLine("Method not found.");}}catch (Exception ex){Console.WriteLine($"An error occurred: {ex.Message}");}}
}
详细步骤解释
  1. 获取 AssemblyQualifiedName:

    • 在上面的示例中,assemblyQualifiedName 包含了完整的类型名称、命名空间、程序集名称及其版本信息。
    • 注意:你需要确保程序集名称和版本信息与实际的类库匹配。如果类库是强命名的,还需要包括 PublicKeyToken
  2. 加载类型:

    • 使用 Type.GetType(assemblyQualifiedName) 方法来加载指定的类型。如果类型或程序集找不到,该方法将返回 null
  3. 创建实例:

    • 使用 Activator.CreateInstance(myType) 方法创建目标类型的实例。
  4. 调用方法:

    • 使用 GetMethods()GetMethod() 方法获取要调用的方法的信息。
    • 使用 Invoke() 方法调用该方法。
运行结果

当你运行上述控制台应用程序时,它会输出:

Hello from MyClass!

这表明成功地通过 AssemblyQualifiedName 动态加载了 MyClass 类型,并调用了其 DisplayMessage 方法。

7. 扩展:如何创建强名称程序集

  • 详见:C# 如何创建强名称程序集

四、汇总

  • Name: 类型的简单名称。
  • FullName: 类型的完全限定名称,包括其命名空间,但不包括程序集。
  • Namespace: 类型所在命名空间的名称。
  • AssemblyQualifiedName: 获取类型的程序集限定名,包含类型及其所在程序集的详细信息,适用于通过反射加载类型

这些属性各有用途,选择哪一个取决于你的具体需求。例如,如果你只是想显示类型的名称给用户看,可能只需要 NameFullName;而如果你需要动态加载类型,则可能需要用到 AssemblyQualifiedName


结语

回到目录页:C#/.NET 知识汇总
希望以上内容可以帮助到大家,如文中有不对之处,还请批评指正。


http://www.ppmy.cn/ops/166814.html

相关文章

使用yolov8+flask实现精美登录界面+图片视频摄像头检测系统

这个是使用flask实现好看登录界面和友好的检测界面实现yolov8推理和展示,代码仅仅有2个html文件和一个python文件,真正做到了用最简洁的代码实现复杂功能。 测试通过环境: windows x64 anaconda3python3.8 ultralytics8.3.81 flask1.1.2…

《大语言模型》学习笔记(三)

GPT系列模型的技术演变 2022 年11月底,OpenAI推出了基于大语言模型的在线对话应用—ChatGPT。由于具备出色的人机对话能力和任务解决能力,ChatGPT一经发布就引发了全社会对于大语言模型的广泛关注,众多的大语言模型应运而生,并且…

优化Go错误码管理:构建清晰、优雅的HTTP和gRPC错误码规范

在系统开发过程中,如何优雅地管理错误信息一直是个棘手问题。传统的错误处理方式往往存在不统一、难以维护等缺点。而 errcode 模块通过对错误码进行规范化管理,为系统级和业务级错误提供了统一的编码标准。本文将带您深入了解 errcode 的设计原理、错误…

uni-app+SpringBoot: 前端传参,后端如何接收参数

做项目中的一些小经验,方便后续 (1)前端代码中,请求的 URL 是通过查询参数(?id${articleId})传递的 后端接口: GetMapping("/knowledgeDetail") public Result getKnowledgeByid(R…

深度解读 | AI驱动下的新型金融对冲策略:稀疏奖励强化学习的应用

“HEDGING WITH SPARSE REWARD REINFORCEMENT LEARNING” 论文地址:https://arxiv.org/pdf/2503.04218 摘要 尽管衍生品作为金融工具在风险管理和提升市场效率方面扮演着关键角色,但传统的对冲模型在处理复杂多变的市场环境时往往显得力不从心。为了应对…

Couchbase Analytics 的结构

Couchbase Analytics 的结构 Couchbase Analytics 服务专为大规模、并发、复杂的分析查询而设计,同时不会影响事务性工作负载的性能。下面将详细介绍其结构和架构,以帮助您深入理解 Couchbase Analytics 的运作方式。 1. Couchbase 集群架构 Couchbase…

uniapp笔记-底部和首部标签页菜单生成

逻辑 这些都是需要配置pages.json文件。 其中底部需要手动配置tarBar,如: "tabBar": {"list":[{"pagePath": "pages/index/index","text": "首页"},{"pagePath": "pages/…

如何在vscode中编译linux中的c++文件

方式一 在终端打开进行连接编译 指令含义:将 muduo_server.cpp 源文件编译成一个可执行文件 server,并且在链接过程中使用 muduo_net、muduo_base 库以及 pthread 库 方式二 在vscode中修改配置文件 按F1打开配置文件搜索栏,输入C/C 打开…