分类
标签
.NET 9008 adb android apt asp.net ASP.NET Core audio bug C c++ C++ chrome cmd csharp CSharp css css3 debian debug dotnet dotnet Framework dpkg GDI&GDI+ gdi&gdi+ golang graphics html html5 http java javascript json kali linux linux mci microsoft minimap MSBuild mysql OpenCV PInvoke powershell python QQ rust shell speex sql tutorial ubuntu ui unity vb.net visual studio Visual Studio web Web win32 winapi windows winform WinForm wpf WPF xaml xfce 列表 刷机 前端 加密 反射 反编译 可视化 图像处理 多线程 字符串 安卓 实例 局域网 幻影坦克 库 开发语言 异步 微信 手册 手机 接口 摘要 救砖 数字签名 数字证书 数字音频 数据库 桌面程序 游戏 游戏引擎 源码 爬虫 玩游戏 电脑硬件 笔记 算法 类库 线性代数 编程语言 网络 脚本语言 计算机图形学 计算机基础 设计模式 语音编解码 运维 进制 面向对象编程 音频 音频编码解码
582 字
3 分钟
[C#] 各种关于类型与反射的常用操作. 类型操作, 根据Type进行类型转换, 接口获取与比较, 泛型接口获取与比较, 类的字段获取与设置.
直切入正题
本文章是面向初学者的一些资料 注意: 存在即合理, 可能某些初学者认为这些东西并无必要, 但实际上它们有很大的用处
获取类型(Type)对象
object obj;
Type objType = obj.GetType();
判断类型是否可以转换
这个方法同样可以判断B是否继承于A(可以是类和接口), 但是如果你要判断一个类是否继承了一个泛型接口, 不指定相同的泛型参数, 是无法判断成功的, 比如一个继承了Demo<string, string>接口的类在使用下面的方法来判断是否继承Demo<>接口时, 就无法获得正确的结果. 这种方法是严谨的.
例子表示了A是否派生B, 也就是B是否继承于A, 或者说B是否可以强制转换为A
bool result = typeof(B).IsAssignableFrom(typeof(B));
获取类型继承的的接口 (包含泛型接口)
- 获取的接口, 都是接口原型, 比如获取到的会是IDicrionary<,>, 而不是IDictionary<TKey, TValue>. 利用这个特性, 我们可以判断一个类型是否继承某个泛型接口, 而不需要指定详细的泛型参数.
- 下面的原始接口指IDictionary<string,string>与IDictionary<,>之间的关系, IDictionary即原始接口 (这个概念并不是公认概念, 但是没有已经规定的概念来描述”原始接口”, 所以在这里提出了这个概念)
Type[] interfaces = typeof(A).GetInterfaces();
参考: 判断是否继承某个泛型接口并获取泛型参数:
// 在这个方法中, 会比对targetType的原始接口是否与interfaceType一致
private static bool CheckInterface(Type targetType, Type interfaceType, out Type[] geneticTypes)
{
foreach(Type i in targetType.GetInterfaces())
{
if (i.GetGenericTypeDefinition().Equals(interfaceType)) // GetGenericTypeDefinition() 即获取原始接口类型. 如果去除这个方法, 则是严谨的比较类型
{
geneticTypes = i.GetGenericArguments();
return true;
}
}
geneticTypes = null;
return false;
}
类的字段获取与设置
以类型A为例:
A obj = new A();
Type objType = typeof(A);
FieldInfo[] fieldInfos = objType.GetFields(); // 获取字段信息
object fieldValue = fieldInfos[0].GetValue(obj); // 获取字段值
fieldInfos[0].SetValue(obj, "这是一个值"); // 设置字段的值
根据Type对象进行类型转换
例如, 将A转换为B
A objA = new A();
object objB = Convert.ChangeType(objA, typeof(B)); // 返回了转换为B类型的对象的引用
[C#] 各种关于类型与反射的常用操作. 类型操作, 根据Type进行类型转换, 接口获取与比较, 泛型接口获取与比较, 类的字段获取与设置.
https://slimenull.com/posts/20201019211601/