C#的dynamic类型允许在运行时绕过编译时类型检查,适用于与动态语言交互、调用COM组件、简化反射及处理未知类型,如通过JsonConvert.DeserializeObject解析JSON数据时可直接访问属性;与var不同,var是编译时推断的静态类型,而dynamic类型在运行时确定,存在性能开销和RuntimeBinderException风险,需谨慎使用于性能敏感或需强类型安全场景;ExpandoObject可创建动态属性对象并支持删除属性,dynamic底层依赖反射实现,但语法更简洁。

C#的动态类型本质上是一种告诉编译器“别管我,我来处理类型安全”的方式。它允许你在编译时绕过类型检查,将类型检查推迟到运行时。使用
dynamic
解决方案:
C# 中的
dynamic
dynamic
dynamic
dynamic
dynamic
dynamic
MethodInfo.Invoke
dynamic
举个例子,假设你有一个从外部数据源(比如 JSON 文件)读取数据的场景,数据的结构在编译时是未知的。你可以使用
dynamic
using Newtonsoft.Json; // 确保安装了 Newtonsoft.Json 包
public class Example
{
public static void Main(string[] args)
{
string json = "{ \"Name\": \"John\", \"Age\": 30 }";
dynamic data = JsonConvert.DeserializeObject(json);
// 访问属性,无需进行类型转换
string name = data.Name;
int age = data.Age;
Console.WriteLine($"Name: {name}, Age: {age}");
}
}在这个例子中,
JsonConvert.DeserializeObject
dynamic
data
Name
Age
dynamic
var
var
dynamic
换句话说,
var
dynamic
var number = 10; // number 在编译时被推断为 int 类型 // number = "hello"; // 编译错误,因为不能将字符串赋值给 int 类型的变量 dynamic dynamicNumber = 10; // dynamicNumber 的类型在运行时确定 dynamicNumber = "hello"; // 运行时类型更改为 string,没有编译错误
使用
dynamic
RuntimeBinderException
例如:
dynamic obj = new { Name = "John" };
// 尝试访问不存在的属性
try
{
Console.WriteLine(obj.Address); // 运行时抛出 RuntimeBinderException
}
catch (Microsoft.CSharp.RuntimeBinder.RuntimeBinderException ex)
{
Console.WriteLine($"Error: {ex.Message}");
}为了避免这些风险,你应该:
dynamic
try-catch
RuntimeBinderException
虽然
dynamic
dynamic
dynamic
dynamic
dynamic
总而言之,
dynamic
ExpandoObject
IDynamicMetaObjectProvider
dynamic
以下是如何使用
ExpandoObject
using System.Dynamic;
public class Example
{
public static void Main(string[] args)
{
// 创建一个 ExpandoObject 实例
dynamic person = new ExpandoObject();
// 动态添加属性
person.Name = "John";
person.Age = 30;
person.Address = "123 Main St";
// 访问属性
Console.WriteLine($"Name: {person.Name}, Age: {person.Age}, Address: {person.Address}");
// 动态删除属性
((IDictionary<string, object>)person).Remove("Address");
// 尝试访问已删除的属性
try
{
Console.WriteLine(person.Address); // 运行时抛出 RuntimeBinderException
}
catch (Microsoft.CSharp.RuntimeBinder.RuntimeBinderException ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
}
}在这个例子中,我们首先创建了一个
ExpandoObject
Name
Age
Address
要删除属性,你需要将
ExpandoObject
IDictionary<string, object>
Remove
ExpandoObject
dynamic
dynamic
dynamic
dynamic
在底层,
dynamic
dynamic
总的来说,
dynamic
以上就是C#的动态类型是什么?如何使用?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号