2015-09-28 79 views
1

获取对象的引用我有一个小问题,我下面的代码:从的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必须在输出“测试2号”。有什么办法吗?这是可能的吗?

+0

这就像一个有约束的属性不是吗?我认为这已经回答了?只是我的2美分。 HTTP://计算器。com/questions/13616161/why-cant-i-have-a-type-constraint-of-object –

回答

1

错!

您使用反射获取字符串而不是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()你会得到整个的最新鲜的价值属性。顺便说一下,这仍然没有解决不可能的问题!

+0

你是对的,我选择了错误的例子。在一段时间内,我将更接近我的问题 –

+0

@MrLuk我相信底层问题可能会有所不同,只需接受我们已经提供给您的一些答案即可结束本问答,并且您可以提出一个不同的问题。如果你在这里添加评论来将我链接到新的问题,我会看看它... –

0

有什么办法吗?

不可以。您不能将对某个属性的引用放入对象变量中。这样的变量只能保存一个正常的值,比如你放入的字符串。

回答问题。你可以澄清你想达到的目标,也许我们可以提出一个更好的方法。

0

有可能是无解的,但我表现出一定的代码

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)。所以也许你有任何其他的建议,如何解决问题。我会很感激你的帮助

+0

你不应该提供**答案**,它不会回答你自己的问题!!!!! !!!!!!!!正如我以前说过的,你应该接受我的答案或其他答案,然后问一个新的问题,复制并粘贴这个错误的答案...... –

+0

是的,我知道。感谢您的帮助 –

+0

基于SO规则..你应该放弃这个“没有答案”... –