0

无论如何要传递一个对象并取回持有对它的引用的对象吗?

例子:

public class Person
{
    public string Name { get; set; }

    public Person(string name)
    {
        this.Name = name;
    }
}

public static class Helper
{

    public static void IsItPossible()
    {
        var person = new Person("John Doe");

        var whoKnowsMe = WhoIsReferencingMe(person.Name);

        //It should return a reference to person
    }

    public static object WhoIsReferencingMe(object aProperty)
    {
        //The magic of reflection
        return null;
    }
}

这里的代码是愚蠢的。但我将使用它来简化 Windows 窗体解决方案中的 DataBinding。

这是我将使用它的地方:

    protected void Bind(object sourceObject, object sourceMember, 
        Control destinationObject, object destinationMember)
    {
        //public Binding(string propertyName, object dataSource, string dataMember);
        string propertyName = GetPropertyName(() => destinationMember);
        string dataMember = GetPropertyName(() => sourceMember);

        Binding binding = new Binding(propertyName, sourceObject, dataMember);

        destinationObject.DataBindings.Add(binding);
    }

    public  string GetPropertyName<T>(Expression<Func<T>> exp)
    {
        return (((MemberExpression)(exp.Body)).Member).Name;
    }

原因是该功能有点多余:

    this.Bind(viewModel.Client, viewModel.Client.Id, view.icClientId, tiew.icClientId.Text);

我要求将其简化为:

    this.Bind(viewModel.Client.Id, view.icClientId.Text);

所以……这有可能发生吗?还是有一种我不知道的更简单的绑定方式?

4

2 回答 2

2

无论如何要传递一个对象并取回持有对它的引用的对象吗?

不,一般来说。如果您使用调试器 API,可能有一些方法可以做到这一点,但用于调试目的。您的产品设计不应该需要它。

不过,您可能会使用表达式树:

this.Bind(() => viewModel.Client.Id, () => view.icClientId.Text);

...并从表达式树中计算出原始对象和它正在使用的属性。

于 2012-11-27T14:06:37.070 回答
0

无论如何要传递一个对象并取回持有对它的引用的对象吗?

不,这不可能作为内置功能。你必须在你的代码中构建它。对象本身不知道指向它的引用。这是一种GC责任,要对此进行追踪。

于 2012-11-27T14:06:17.767 回答