首页 > 编程语言 >C#反射获子类所继承的父类中,属性的私有get/set方法

C#反射获子类所继承的父类中,属性的私有get/set方法

时间:2023-05-05 14:45:13浏览次数:36  
标签:set obj get 子类 setMethod MyChildClass property MyProperty

这两天遇到个好玩的东西,过程是这样的:

有这样的两个类,它们都被封装到同一个dll中。

public abstract class MyClass
{
    public int MyProperty
    {
        get;
        private set;
    }
}

public class MyChildClass : MyClass
{
    public int MyProperty2
    {
        get;
        private set;
    }
}

MyChildClass继承自MyClass

MyClass里面有个MyProperty属性是public的

但是里面set方法是private的。

        MyChildClass obj = new MyChildClass();
        Type type = obj.GetType();
        PropertyInfo property = type.GetProperty("MyProperty");
        MethodInfo setMethod = property.GetSetMethod(true);
        setMethod.Invoke(obj, new object[] { 42 });

        Console.WriteLine(property.GetValue(obj)); // 输出 42

目的是:通过实例化的MyChildClass获取父类里面的MyProperty里面的set方法进行赋值的操作。

但是这样执行后发现setMethod一直是空的。

找了好多方法也反射不出来父类的公共属性的set方法。

后来找API发现了个MemberInfo里面有个DeclaringType,这个就可以解决上述问题。

        MyChildClass obj = new MyChildClass();
        Type type = obj.GetType();
        PropertyInfo property = type.GetProperty("MyProperty").DeclaringType.GetProperty("MyProperty");
        MethodInfo setMethod = property.GetSetMethod(true);
        setMethod.Invoke(obj, new object[] { 42 });

        Console.WriteLine(property.GetValue(obj)); // 输出 42

只需这样写就好了

PropertyInfo property = type.GetProperty("MyProperty").DeclaringType.GetProperty("MyProperty");

 

就这样

拜拜~

 

标签:set,obj,get,子类,setMethod,MyChildClass,property,MyProperty
From: https://www.cnblogs.com/yzxhz/p/17374100.html

相关文章

  • Ubantu20.4 换源:apt-get 软件更新镜像源
    参考地址:点击这里TRANSLATEwithxEnglishArabicHebrewPolishBulgarianHindiPortugueseCatalanHmongDawRomanianChineseSimplifiedHungarianRussianChineseTraditionalIndonesianSlovakCzechItalianSlovenianDanishJapaneseSp......
  • 利用hf datasets库包构建自己的数据集
    !wgethttps://raw.githubusercontent.com/zhangbo2008/data_ner/main/aomanyupianjian-Oaaaa!pipinstalldatasets#=======加载自己数据集withopen('aaaa')asf:t=f.readlines()save1=[]save2=[]a=''b=''foriint:ifi=......
  • 【剪裁 widget】Flutter ClipOval 与 Flutter ClipRRect
    本文是【剪裁widget】系列的第三篇,也是最后一篇,今天介绍一下ClipOval和ClipRRect。ClipOval介绍FlutterClipOval用椭圆形去剪裁child,path以外的部分不显示,还能高效的实现动画。剪裁是在绘制阶段,具体实现是在paint方法中调用PaintingContext类的pushClipPath方法进......
  • set -o pipefail
    set-opipefail causesapipeline(forexample,curl-shttps://sipb.mit.edu/|grepfoo)toproduceafailurereturncodeifanycommanderrors.Normally,pipelinesonlyreturnafailureifthelastcommanderrors.Incombinationwithset-e,thiswill......
  • get()和set()方法在保护类安全性上的意义
    1、起因如果为一个private变量设置了get()和set()方法,不就是相当于其为public变量吗?这样做是不是过于繁琐了?如果对形如下方的简单代码而言,可以说是上面的疑惑是对的publicclassSimpleGetAndSet{privateintn;publicSimpleGetAndSet(intn){this.n=......
  • 批处理中setlocal enabledelayedexpansion 变量延迟(转)
    本质上是因为批处理读取命令时是按行读取的(另外例如for命令等,其后用一对圆括号闭合的所有语句也当作一行)在一行中即使是使用变量赋值也是无作用的,使用才有了变量延迟https://www.jb51.net/article/29323.htm ......
  • MFC-CListCtrl-LVM_GETITEMTEXT获取项信息
     LVITEMlvi;TCHARch[256];lvi.pszText=ch;lvi.cchTextMax=256;lvi.mask=LVIF_TEXT;::SendMessage(hWnd4,LVM_GETITEMTEXT,(WPARAM)0,(LPARAM)&lvi);//获取项信息/*参数3:WPARAM列表视图项的索引参数4:LPARAM指向LVIT......
  • 5月4日:unordermap/set,哈希以及哈希常用的拉链法,开放地址法,以及模板的特化相关应用
    起处较为流行的数据储存方式为树形结构,再加上红黑树等优秀数据结构的发展,直到今天二叉平衡搜索树也经常被应用在各种方面,但是c++库里面还有两个与map/set很像的容器unorderedmap,他们的调用与普通的map几乎一样,有着非常优秀的查找时间复杂度,只是不能像二叉树哪样层序遍历得到顺序的......
  • Identity – user login, forgot & reset password, 2fa, external login, logout 实
    前言之前写过一篇 Identity–UserLogin,ForgotPassword,ResetPassword,Logout,当时写的比较简陋,今天有机会就写多一篇实战版.建议先阅读之前那篇做一个warmup.本篇会讲到1.userlogin2.forgotandresetpassword3.twofactor4.logout5.externallogin......
  • 兼容 windows 和 Linux 的fgets文件读取方式(判断文件尾)
    /*检测文件尾范例使用fgets读取文件*//*范例:检测文件尾,windows和linux,unix平台兼容版本*/#include<stdio.h>#include<stdlib.h>#defineBUFSIZE100intmain(void){FILE*f;charstr[BUFSIZE];char*result;//读方式打开文件hello.txt,如果文件不......