永发信息网

C#反射的问题,困扰了很久

答案:4  悬赏:60  手机版
解决时间 2021-01-23 17:57
问题我简单的描述一下,就是一个conplex类型A里面定义了一些property和complex B,而complex B里又定义了一些属性,现在我要去反射complex B里的一个属性"attribute"并update它,以下是我的步骤:
var propertyInfo= A.GetType().GetProperty(B);
propertyInfo.GetType().GetProperty(attribute).SetValue(propertyInfo,"has updated").
但是问题出来,第一不是可以正确get到B的类型,但是在第二步去get "attribute"的时候会出现get不到的情况。
在线等高手~
最后描述有点问题。
第一可以正确get到B的类型,但是在第二步去get "attribute"的时候会出现get不到的情况。
最佳答案
你必须针对B的对象SetValue。象下面这样
   [STAThread]
    public static void Main(string[] args)
    {
        var a = new Conplex();
        a.B = new Complex();
        a.B.Attribute = "测试1";

        Console.WriteLine("设置前:" + a.B.Attribute);
        var bPropertyInfo = a.GetType().GetProperty("B");
        var bObj = bPropertyInfo.GetValue(a);
        var attrPropertyInfo = bObj.GetType().GetProperty("Attribute");
        attrPropertyInfo.SetValue(bObj, "has updated"); //<-- 重点在这里,针对bObj进行设置

        Console.WriteLine("设置后:" + a.B.Attribute);

        Console.ReadKey();

        
    }

    class Conplex
    {
        public Complex B { get; set; }
    }

    class Complex
    {
        public string Attribute { get; set; }
    }
全部回答
这里你把var的实际类型写出来可能会更容易发现问题所在 好吧不卖关子了,这里的var的类型是PropertyInfo,自定义的attribute属性是在哪个类上面?complexB对吧?那你应该调用一个complexB实例的GetType方法,而不是对一个PropertyInfo调用GetType,你这样获取的是PropertyInfo的Type 所以把propertyInfo.GetType()改成propertyInfo.PropertyType就OK啦
我先定义了一个接口,比如说一个播放器的编码。现在有几百种的视频文件,我只能播放其中的几十种。这每一种对象类型都必须继承我的接口。现在,我所知道的只是这个接口的名字,能看到的只是我现在定义的这几十中类型,当我要对其每一种进行操作时,也可用一个switch语句将其一个一个判断,并经行实例化,最后成功操作。显然这里用反射的话,已经显现出优势了,就是通过一个类型名,就可以轻松的创建实例。另外,现在有人发现有一种视频文件更适合他的需要,于是,他写了一个类型,使其继承我的接口,并将这个类型反应成一个视频文件。试问,你这时,根本无法知道这个类型的名字,怎么using?另外,你可能又提供了一些视口的操作的接口,容许他的视频文件包含一些操作,如一些文件不允许快进,一些又允许;有的播放器却什么文件都能快进。这些是在类里又加了一些用来操作的方法,那么试问,你连这个类型的名字和方法的名字都不知道,怎么using,甚至你都无法知道程序是怎么运行的,因为你只能让程序自己去找到这些。 system.reflection.assembly aa = assembly.loadfile(""); object cc = aa.createinstance(""); 的确需要类名,但你可以让程序自己去找类名,比如根据当前的对象的某个接口实现的属性或方法得到类名,并根据类名创建对象,或反射出其方法(这里可以让接口包括一个得到方法列表的属性,即返回值是一个字符串数组。),这就可以了。
using System; using System.Reflection; namespace CSharpCon {     class Program     {         static void Main(string[] args)         {             conplex a = new conplex();             PropertyInfo pInfo = a.GetType().GetProperty("B");             PropertyInfo pInfo_Att = pInfo.PropertyType.GetProperty("Attribute");             pInfo_Att.SetValue(a.B, "abcdefG", null);         }     } } public class Complex {     private String attribute;     public String Attribute     {         get { return attribute; }         set { attribute = value; }     } } public class conplex {     private Complex b;     public Complex B     {         get { return b; }         set { b = value; }     }     public conplex()     {         b = new Complex();     } }
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
富安物流(八角路与南山大道交叉口北150米富安
荆州区地税局地址在什么地方,想过去办事,
茅坪邮政支局(茅坪镇一居委会)地址在什么地方
株洲市至永洲市的班车在哪里坐
谁知道哪有卖陕西特产龙须酥的啊?
荆州区地方税务局西城分局地址好找么,我有些
华安物流(南山大道)地址好找么,我有些事要过
荆州区地方税务局城中分局地址好找么,我有些
吃了乌梅后,屎像染过一样绿的,是什么原因
清溪邮政所(儒林镇清溪责任区枫香村清溪邮政
事业单位公示期后多久有通知
单选题选出下列句子中没有错别字的一句。A.太
说一个人性格有7到8分什么意思
三人行快运有限公司(中心路与城东路交叉口北5
请问,宝宝是病毒性感冒,宝宝6个月了到检查说
推荐资讯
北纬N28°52′52.95″ 东经E105°25′57.85″
庆盟超市地址有知道的么?有点事想过去!
安生信用社地址在哪,我要去那里办事,
一个离婚的男人在微信个性签名写的太傻了是什
体积为5×10-4米3的小球用手放入水中,并使它
今年10月份父亲在交通事故中受伤,肋骨骨折,
紫檀树为什么会长成空心?
图中甲、乙两地位于同一经线上,相距300公里
天籁火吧地址有知道的么?有点事想过去
哈尼宝贝早教中心(望园店)地址有知道的么?有
单选题中国秦朝制定的法律细密严苛,实行“轻
如图,矩形ABCD是供一辆机动车停放的车位示意
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?