如何访问对象的某些(私有)属性?

时间:2013-06-02 14:37:44

标签: c# object

我有

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 ();

如何访问变量urlwidthheight

谢谢!

5 个答案:

答案 0 :(得分:11)

您有两种选择:

  1. 制作属性public而不是private
  2. 使用reflection访问属性。
  3. 我建议使用(1)。

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

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

    如果您要求始终设置thumbnail属性,则可以按如下方式将构造函数添加到类Item(其中我还删除了缩略图和大写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; }
    }
    

    使用Reflection获取和设置私有属性

    要使用反射,这是一个例子。鉴于这样的课程:

    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");
    

答案 1 :(得分:1)

  

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

所以我认为你应该将它们宣布为公开

public class thumbnail 
{

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

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

答案 2 :(得分:0)

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

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 class thumbnail 
{

 protected string url { get; set; }
 protected string width { get; set; }
 protected string height { get; set; }
}

要访问该类的私有属性,您必须使用反射。请参阅此SO问题:.NET Get private property via Reflection

答案 3 :(得分:0)

您无法访问它们,因为它们是私有属性。您可以访问它的方式是由thumbnail本身的成员在内部访问它们。

如果您希望在课堂外访问它们,请成员public

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

答案 4 :(得分:0)

或者你可以这样做:

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

这将允许您读取但不能写入。