是否有可能通过反射获得房产的私人二传手?



我编写了一个自定义序列化程序,它通过反射设置对象属性来工作。可序列化类使用可序列化属性进行标记,所有可序列化属性也进行标记。例如,以下类是可序列化的:

[Serializable]
public class Foo
{
   [SerializableProperty]
   public string SomethingSerializable {get; set;}
   public string SometthingNotSerializable {get; set;}
}

当序列化程序被要求反序列化SomethingSerializable时,它会获取属性的set方法,并使用它来设置它,方法如下:

PropertyInfo propertyInfo; //the property info of the property to set
//...//
if (propertyInfo.CanWrite && propertyInfo.GetSetMethod() != null)
{
   propertyInfo.GetSetMethod().Invoke(obj, new object[]{val});
}

这很好,但是,如何使属性setter只能由序列化程序访问呢?如果setter是私有的:

public string SomethingSerializable {get; private set;}

则对CCD_ 2的调用在串行器中返回null。有没有任何方法可以访问私有setter,或者有任何其他方法可以确保只有序列化程序才能访问setter?不能保证序列化程序在同一程序集中。

正如您已经发现的,访问非公共setter的一种方法如下:

PropertyInfo property = typeof(Type).GetProperty("Property");
property.DeclaringType.GetProperty("Property");
property.GetSetMethod(true).Invoke(obj, new object[] { value });

不过,还有另一种方法:

PropertyInfo property = typeof(Type).GetProperty("Property");
// if Property is defined by a base class of Type, SetValue throws
property = property.DeclaringType.GetProperty("Property");
property.SetValue(obj, value, BindingFlags.NonPublic | BindingFlags.Instance, null, null, null);  // If the setter might be public, add the BindingFlags.Public flag.

从搜索引擎来这里

这个问题特别是关于访问公共属性中的非公共setter。

  • 如果属性和setter都是公共的,那么只有第一个示例适用。要使第二个示例起作用,您需要添加BindingFlags.Public标志
  • 如果该属性是在父类型中声明的,并且对调用GetProperty的类型不可见,则您将无法访问它。您需要对该属性可见的类型调用GetProperty。(只要属性本身是可见的,这不会影响私人设置者。)
  • 如果继承链中有多个针对同一属性的声明(通过new关键字),则这些示例将针对调用GetProperty的类型立即可见的属性。例如,如果类A使用public int Property声明Property,而类B通过public new int Property重新声明Property,则typeof(B).GetProperty("Property")将返回在B中声明的属性,而typeof(A).GetProperty("Property")将返回在A中声明的特性

相关内容

  • 没有找到相关文章

最新更新