这两天遇到个好玩的东西,过程是这样的:
有这样的两个类,它们都被封装到同一个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