从PropertyInfo获取对象引用

时间:2015-09-28 09:37:15

标签: c# 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”。有什么办法吗?这有可能吗?

3 个答案:

答案 0 :(得分: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(),您就可以获得整个酒店最新鲜的价值。顺便说一句,这仍然没有解决不可能的问题!

答案 1 :(得分:0)

  

有什么办法吗?

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

按照要求回答问题。你可以澄清你想要达到的目标,也许我们可以建议一个更好的方法。

答案 2 :(得分: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)。所以也许你有任何其他建议,如何解决问题。我将非常感谢你的帮助