11

我有

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

谢谢!

4

5 回答 5

16

你有两个选择:

  1. 制作属性public而不是private.
  2. 用于reflection访问属性。

我建议使用(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; }
}

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

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

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");
于 2013-06-02T14:40:32.530 回答
1

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

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

public class thumbnail 
{

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

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

于 2013-06-02T14:40:58.253 回答
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

于 2013-06-02T14:39:40.693 回答
0

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

如果您希望在课堂外访问它们,请将 members 设置为public.

public class thumbnail 
{
   public string url { get; set; }
   public string width { get; set; }
   public string height { get; set; }
}
于 2013-06-02T14:41:27.627 回答
0

或者,您可以这样做:

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

这将允许您阅读但不能写作。

于 2021-05-03T18:47:16.893 回答