如果我有
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
的值?
答案 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(或类似)提供的发布/订阅系统在类之间发送和接收通知,并解除ClassA
和ClassB
之间的直接依赖关系。
考虑改变你的课程。
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();
}
}
它会吐到控制台
您需要通过NuGet安装MVVMLight库才能开始使用。
PM&GT;安装包MvvmLightLibs -Version 5.2.0