在C#中获取对属性的引用,并将其分配给另一个属性

时间:2016-08-07 13:25:12

标签: c# reflection

如果我有

public class ClassA
{
    public static IEnumerable<string> WhateverA { get; set; }
}

以及

public class ClassB
{
    public static IEnumerable<string> WhateverB { get; set; }
}

是否有可能获得对ClassA.WhateverA的引用并将其分配给ClassB.WhateverB,以便稍后为WhateverA分配值,WhateverB将被赋予相同的值?

如果我希望对方法做同样的事情,那么我可以将WhateverB声明为Action,然后将WhateverA指定为委托,从而赋予它一种“通过 - 通过'能力。是否可以对属性执行相同操作,以使WhataverB始终显示WhateverA的值?

2 个答案:

答案 0 :(得分:1)

如果你在ClassB中引用ClassA,你可以简单地包装ClassA属性。

public class ClassB
{
    static ClassA a;

    public static IEnumerable<string> WhateverB
    {
        get { return a.WhateverA; }
        set { a.WhateverA = value; }
    }
}

如果没有,您可以使用Action&lt;&gt;和Func&lt;&gt;将代表传递给getter和setter - 类似于你所说的用方法做的。你只需要将setter和getter视为单独的方法(在它们下面)。

使用setter执行此操作:     公共类ClassB     {         静态动作&gt; aSetter;         static Func&gt; aGetter;

    public static IEnumerable<string> WhateverB
    {
        get
        {
             if (aGetter != null)
             {
                 return aGetter();
             }
        }
        set
        {
             if (aSetter != null)
             {
                 aSetter(value);
             }
        }
    }
}

答案 1 :(得分:0)

您可以使用MVVMLight(或类似)提供的发布/订阅系统在类之间发送和接收通知,并解除ClassAClassB之间的直接依赖关系。

考虑改变你的课程。

public class ClassA
{
    private static IEnumerable<string> _whateverA;

    public static IEnumerable<string> WhateverA
    {
        get { return _whateverA; }
        set
        {
            _whateverA = value;
            // property changed, send message
            Messenger.Default.Send(new MyMessage(value));
        }
    }
}

public class ClassB
{
    public ClassB()
    {
        // receive message
        Messenger.Default.Register<MyMessage>(this, message => 
        {
            WhateverB = message.Value;
            Console.WriteLine(string.Join(" ", WhateverB));
        });
    }

    public static IEnumerable<string> WhateverB { get; set; }
}

现在每当ClassA属性发生变化时,它都会通知ClassB相应地更改其属性值。如果实例不存在,它也不会在运行时使代码崩溃。

以上MyMessage是帮助传递数据的简单类。你决定这个类应该是什么样的(保存所有的ClassA实例?)。

public class MyMessage : MessageBase
{
    public MyMessage(IEnumerable<string> value)
    {
        Value = value;
    }

    public IEnumerable<string> Value { get; private set; } 
}

现在,如果你有一个超级好的程序

public class Program
{
    static void Main()
    {
        var b = new ClassB();

        ClassA.WhateverA = new List<string> { "this", "is", "whatever" };
        Console.ReadLine();
    }
}

它会吐到控制台

example

您需要通过NuGet安装MVVMLight库才能开始使用。

  

PM&GT;安装包MvvmLightLibs -Version 5.2.0