[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类型的对象的引用
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值