我如何访问对象的一些(私有)属性
本文关键字:私有 属性 对象 访问 何访问 | 更新日期: 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
, width
和height
?
谢谢!
您有两个选择:
- 将
private
改为public
- 使用
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; }
}