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