我如何访问对象的一些(私有)属性

本文关键字:私有 属性 对象 访问 何访问 | 更新日期: 2023-09-27 18:16:33

我有

public class Item
{
    public string description { get; set; }
    public string item_uri { get; set; }
    public thumbnail thumbnail { get; set; }
}

public class thumbnail 
{
 private string url { get; set; }
 private string width { get; set; }
 private string height { get; set; }
}

如果我像这样创建一个对象Item

 Item item = new Item ();

如何访问变量url, widthheight ?

谢谢!

我如何访问对象的一些(私有)属性

您有两个选择:

  1. private改为public
  2. 使用reflection访问属性

我建议使用(1)。

注意,您还需要初始化item.thumbnail:

Item item = new Item ();
item.thumbnail = new thumbnail();

如果您要求始终设置thumbnail属性,则可以向Item类添加构造函数,如下所示(其中我还删除了缩略图的setter并将Thumbnail类的名称大写)。类名必须以大写字母开头):

public class Item
{
    public Item(Thumbnail thumbnail)
    {
        if (thumbnail == null)
            throw new ArgumentNullException("thumbnail");
        this.thumbnail = thumbnail;
    }
    public string description { get; set; }
    public string item_uri { get; set; }
    public thumbnail thumbnail { get; }
}

使用反射获取和设置私有属性

要使用反射,这里有一个示例。给定这样一个类:

public class Test
{
    private int PrivateInt
    {
        get;
        set;
    }
}

你可以像这样设置和获取它的PrivateInt属性:

Test test = new Test();
var privateInt = test.GetType().GetProperty("PrivateInt", BindingFlags.Instance | BindingFlags.NonPublic);
privateInt.SetValue(test, 42); // Set the property.
int value = (int) privateInt.GetValue(test); // Get the property (will be 42).

使用辅助方法进行简化

您可以通过编写几个泛型助手方法来简化此操作,如:

public static T GetPrivateProperty<T>(object obj, string propertyName)
{
    return (T) obj.GetType()
                  .GetProperty(propertyName, BindingFlags.Instance | BindingFlags.NonPublic)
                  .GetValue(obj);
}
public static void SetPrivateProperty<T>(object obj, string propertyName, T value)
{
    obj.GetType()
       .GetProperty(propertyName, BindingFlags.Instance | BindingFlags.NonPublic)
       .SetValue(obj, value);
}

那么Test类的例子将是这样的:

Test test = new Test();
SetPrivateProperty(test, "PrivateInt", 42);
int value = GetPrivateProperty<int>(test, "PrivateInt");

属性是提供灵活机制来读取、写入或计算私有字段值的成员

所以我认为你应该将它们声明为public

public class thumbnail 
{
 public string url { get; set; }
 public string width { get; set; }
 public string height { get; set; }
}

也许你可以有私有类变量,然后你可以通过这些公共属性访问它们。

您不能访问它们,因为它们是私有属性。您可以通过thumbnail本身的成员内部访问它们。

如果你想在类外访问它们,让成员public

public class thumbnail 
{
   public string url { get; set; }
   public string width { get; set; }
   public string height { get; set; }
}

您还需要将属性缩略图设置为新对象。

Item item = new Item ();
item.thumbnail = new thumbnail();
item.thumbnail.url = "http://www.microsoft.com";

也可以让Item的构造函数设置它。

public class Item
{
    public Item()
    {
        thumbnail = new thumbnail();
    }
    public string description { get; set; }
    public string item_uri { get; set; }
    public thumbnail thumbnail { get; set; }
}

您应该将属性或缩略图类设置为public或protected。您也可以使用internal,但是internal的作用域非常有限。

public class thumbnail 
{
 protected string url { get; set; }
 protected string width { get; set; }
 protected string height { get; set; }
}

要访问类的私有属性,必须使用反射。.NET通过反射获取私有属性

您也可以这样做:

public class thumbnail 
{
   private string url { get; private set; }
   private string width { get; private set; }
   private string height { get; private set; }
}