В одном классе есть поле. Второй класс должен иметь возможность ссылаться на это поле и изменять его. Поскольку вы не можете получить адрес поля в памяти, я должен использовать отражения. Но мой подход работает только с неинкапсулированными полями. Так что в принципе:Полевые ссылки и размышления
Это работает:
public class Dummy
{
public int field;
public Dummy(int value)
{
this.field = value;
}
}
class Program
{
public static void Main()
{
Dummy d = new Dummy(20);
//Shows 20
Console.WriteLine(d.field.ToString());
d.GetType().GetField("field", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).SetValue(d, 40);
//It should show 40 now
Console.WriteLine(d.field.ToString());
}
}
Это не (броски NullReferenceException):
public class Dummy
{
public int field { get; set; }
public Dummy(int value)
{
this.field = value;
}
}
class Program
{
public static void Main()
{
Dummy d = new Dummy(20);
//Shows 20
Console.WriteLine(d.field.ToString());
d.GetType().GetField("field", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).SetValue(d, 40);
//It should show 40 now
Console.WriteLine(d.field.ToString());
}
}
Почему? Как это исправить? Могу ли я даже получить доступ к инкапсулированному объекту? Спасибо!
В вашем втором примере это не 'поле', а свойство' property'. – EkoostikMartin
Зачем вам нужно отражение здесь? И «поле», и «свойство» являются общедоступными, поэтому 'd.field = 40;' ... – Alden
Это скорее просто глупый пример, чтобы прояснить ситуацию. Вам явно не нужно размышлять. – JTaylor