我有一个小问题,在我的代码下面:
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必须在输出"测试号2"。有办法吗?这有可能吗?
错了!
您正在使用反射获得字符串而不是A
的实例。
改变A.ObjectA
不会改变字符串引用。实际上,您通过ObjectA
属性将不同的字符串设置为支持字符串类字段…
自动属性是语法糖,以避免显式地将类字段声明为在获取或设置其值时不执行任何操作的属性:
// 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";
号有办法吗?这有可能吗?
也许您可以使用Func<T>
来模拟此行为…
Func<object> myNewObjectGetter = () => myPropertyInfo.GetValue(a);
现在,当你调用myNewObjectGetter()
时,你将获得整个属性的最新值。顺便说一句,这仍然没有解决不可能的问题!
有办法吗?
。不能将对属性的引用放入对象变量中。这样的变量只能保存一个正常的值,比如你输入的字符串。
这就回答了问题。你可以说清楚你想达到的目标,也许我们可以提出一个更好的方法。
可能没有解决方案,但我展示了一些代码
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
也必须改变。正如我上面所写的,这可能是不可能的,但也许有人有一个想法。
BTW:值mr.Val
我只用于绑定(WPF)。所以也许你有其他的建议,如何解决问题。非常感谢您的帮助