c# - 是否有可能通过反射获得属性(property)的私有(private)二传手?

标签 c# serialization reflection

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

[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 是私有(private)的:

public string SomethingSerializable {get; private set;}

然后调用 propertyInfo.GetSetMethod() 在序列化程序中返回 null。有什么方法可以访问私有(private) setter 或任何其他方法来确保只有序列化程序才能访问 setter ?序列化器不保证在同一个程序集中。

最佳答案

如您所知,访问非公共(public) 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.

从搜索引擎来到这里?

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

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

关于c# - 是否有可能通过反射获得属性(property)的私有(private)二传手?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9219261/

相关文章:

java - 在 MVC 中从 WCF 服务反序列化 Json 时出错

c# - EPPlus 绑定(bind)后不计算公式输出

c# - MVC 函数返回但在发送结果之前等待异步函数

java - 使用 put/getSerializable 进行 Android 序列化

reflection - Kotlin - 是否有一种聪明的方法可以为类的所有方法抛出 NotImplementedError?

C# System.Type 是命名空间?

c# - 从字符串创建对象名称

C# BackgroundWorker 不工作

c# - 在 Visual C# Express 2010 中使用 ANTLR 编译时出错

php - JQuery Datatables序列化数据到mysql数据库