gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 04:34:13 24 4
gpt4 key购买 nike

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

[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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com