我有
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
,width
和height
?
谢谢!
答案 0 :(得分:11)
您有两种选择:
public
而不是private
。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; }
}
使用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; }
}
这将允许您读取但不能写入。