从 PropertyInfo 获取对象引用
Get object reference from PropertyInfo
我有一个小问题,下面是我的代码:
public class A
{
public string ObjectA { get; set; }
}
public void Run()
{
A a = new A();
a.ObjectA = "Test number 1";
BindingFlags flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
PropertyInfo myPropertyInfo = a.GetType().GetProperty("ObjectA", flags);
object myNewObject = myPropertyInfo.GetValue(a);// Here should be reference
a.ObjectA = "Test number 2";//After this line value myNewObject continued "Test number 1"
}
所以我的值 myNewObject 必须在输出 "Test number 2" 中。有什么办法吗?这根本就可以吗?
错了!
您正在使用反射获取字符串而不是 A
的实例。
更改 A.ObjectA
不会更改字符串引用。实际上,您通过 ObjectA
属性...
为支持字符串 class 字段设置了不同的字符串
自动属性是语法糖,可避免向在获取或设置值时不执行任何操作的属性显式声明 class 字段:
// For example:
public string Text { get; set; }
// is...
private string _text;
public string Text { get { return _text; } set { _text = value; } }
现在把你的代码变成普通代码(没有反射):
A a = new A();
a.ObjectA = "hello world";
object myNewObject = a.ObjectA;
// Do you think now that myNewObject should change...? :)
a.ObjectA = "goodbye";
Is there any way? It is this at all possible?
没有
或许您可以使用 Func<T>
...
模拟此行为
Func<object> myNewObjectGetter = () => myPropertyInfo.GetValue(a);
现在,无论何时调用 myNewObjectGetter()
,您都将获得整个 属性 的最新值。顺便说一句,这仍然没有解决不可能的问题!
Is there any way?
没有。您不能将对 属性 的引用放入对象变量中。这样的变量只能保存一个普通的值,比如你放入其中的字符串。
回答了问题。您可以阐明您想要实现的目标,也许我们可以建议更好的方法。
可能没有解决方案,但我展示了一些代码
public class MyRows
{
public string Key { get; set; }
public int Id { get; set; }
public object Val { get; set; }
}
public abstract class BasicDTO
{
public int? Id { get; private set; }
public PropertyInfo[] PropertyDTO;
protected Type myType;
public BasicDTO()
{
Load();
BindingFlags flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
PropertyDTO = myType.GetProperties(flags);
}
}
public class CustomerDTO : BasicDTO
{
public string Surname { get; set; }
public string Phone { get; set; }
public CustomerDTO() { }
protected override void Load()
{
myType = typeof(CustomerDTO);
}
}
现在我的基本方法
public void Run(BasicDTO dto)
{
PropertyInfo pi = dto.PropertyDTO.Where(x => x.Name == "Surname").SingleOrDefault();
MyRows mr = new MyRows();
mr.Val = pi.GetValue(dto);//Here I need reference
}
当我更改 CustomerDTO.Surname
我的值 mr.Val
时,它也必须更改。
正如我上面写的,这可能是不可能的,但也许有人有想法。
顺便说一句:值 mr.Val
我仅用于绑定 (WPF)。所以也许你有任何其他建议,如何解决问题。我会很感激你的帮助
我有一个小问题,下面是我的代码:
public class A
{
public string ObjectA { get; set; }
}
public void Run()
{
A a = new A();
a.ObjectA = "Test number 1";
BindingFlags flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
PropertyInfo myPropertyInfo = a.GetType().GetProperty("ObjectA", flags);
object myNewObject = myPropertyInfo.GetValue(a);// Here should be reference
a.ObjectA = "Test number 2";//After this line value myNewObject continued "Test number 1"
}
所以我的值 myNewObject 必须在输出 "Test number 2" 中。有什么办法吗?这根本就可以吗?
错了!
您正在使用反射获取字符串而不是 A
的实例。
更改 A.ObjectA
不会更改字符串引用。实际上,您通过 ObjectA
属性...
自动属性是语法糖,可避免向在获取或设置值时不执行任何操作的属性显式声明 class 字段:
// For example:
public string Text { get; set; }
// is...
private string _text;
public string Text { get { return _text; } set { _text = value; } }
现在把你的代码变成普通代码(没有反射):
A a = new A();
a.ObjectA = "hello world";
object myNewObject = a.ObjectA;
// Do you think now that myNewObject should change...? :)
a.ObjectA = "goodbye";
Is there any way? It is this at all possible?
没有
或许您可以使用 Func<T>
...
Func<object> myNewObjectGetter = () => myPropertyInfo.GetValue(a);
现在,无论何时调用 myNewObjectGetter()
,您都将获得整个 属性 的最新值。顺便说一句,这仍然没有解决不可能的问题!
Is there any way?
没有。您不能将对 属性 的引用放入对象变量中。这样的变量只能保存一个普通的值,比如你放入其中的字符串。
回答了问题。您可以阐明您想要实现的目标,也许我们可以建议更好的方法。
可能没有解决方案,但我展示了一些代码
public class MyRows
{
public string Key { get; set; }
public int Id { get; set; }
public object Val { get; set; }
}
public abstract class BasicDTO
{
public int? Id { get; private set; }
public PropertyInfo[] PropertyDTO;
protected Type myType;
public BasicDTO()
{
Load();
BindingFlags flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
PropertyDTO = myType.GetProperties(flags);
}
}
public class CustomerDTO : BasicDTO
{
public string Surname { get; set; }
public string Phone { get; set; }
public CustomerDTO() { }
protected override void Load()
{
myType = typeof(CustomerDTO);
}
}
现在我的基本方法
public void Run(BasicDTO dto)
{
PropertyInfo pi = dto.PropertyDTO.Where(x => x.Name == "Surname").SingleOrDefault();
MyRows mr = new MyRows();
mr.Val = pi.GetValue(dto);//Here I need reference
}
当我更改 CustomerDTO.Surname
我的值 mr.Val
时,它也必须更改。
正如我上面写的,这可能是不可能的,但也许有人有想法。
顺便说一句:值 mr.Val
我仅用于绑定 (WPF)。所以也许你有任何其他建议,如何解决问题。我会很感激你的帮助