繁体   English   中英

从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必须在输出“测试编号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 ,也必须更改它。 正如我在上面所写,这可能是不可能的,但也许任何人都有一个主意。

顺便说一句:值mr.Val我只用于绑定(WPF)。 因此,也许您还有其他建议,如何解决问题。 我将感谢您的帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM