永发信息网

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

答案:4  悬赏:60  手机版
解决时间 2021-01-23 17:57
  • 提问者网友:王者佥
  • 2021-01-22 21:42
问题我简单的描述一下,就是一个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不到的情况。
最佳答案
  • 五星知识达人网友:琴狂剑也妄
  • 2021-01-22 23:17
你必须针对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; }
    }
全部回答
  • 1楼网友:雾月
  • 2021-01-23 03:10
这里你把var的实际类型写出来可能会更容易发现问题所在 好吧不卖关子了,这里的var的类型是PropertyInfo,自定义的attribute属性是在哪个类上面?complexB对吧?那你应该调用一个complexB实例的GetType方法,而不是对一个PropertyInfo调用GetType,你这样获取的是PropertyInfo的Type 所以把propertyInfo.GetType()改成propertyInfo.PropertyType就OK啦
  • 2楼网友:琴狂剑也妄
  • 2021-01-23 02:00
我先定义了一个接口,比如说一个播放器的编码。现在有几百种的视频文件,我只能播放其中的几十种。这每一种对象类型都必须继承我的接口。现在,我所知道的只是这个接口的名字,能看到的只是我现在定义的这几十中类型,当我要对其每一种进行操作时,也可用一个switch语句将其一个一个判断,并经行实例化,最后成功操作。显然这里用反射的话,已经显现出优势了,就是通过一个类型名,就可以轻松的创建实例。另外,现在有人发现有一种视频文件更适合他的需要,于是,他写了一个类型,使其继承我的接口,并将这个类型反应成一个视频文件。试问,你这时,根本无法知道这个类型的名字,怎么using?另外,你可能又提供了一些视口的操作的接口,容许他的视频文件包含一些操作,如一些文件不允许快进,一些又允许;有的播放器却什么文件都能快进。这些是在类里又加了一些用来操作的方法,那么试问,你连这个类型的名字和方法的名字都不知道,怎么using,甚至你都无法知道程序是怎么运行的,因为你只能让程序自己去找到这些。 system.reflection.assembly aa = assembly.loadfile(""); object cc = aa.createinstance(""); 的确需要类名,但你可以让程序自己去找类名,比如根据当前的对象的某个接口实现的属性或方法得到类名,并根据类名创建对象,或反射出其方法(这里可以让接口包括一个得到方法列表的属性,即返回值是一个字符串数组。),这就可以了。
  • 3楼网友:平生事
  • 2021-01-23 00:45
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();     } }
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯