参考下面的示例,有没有办法将GetType1s()和GetType2s()完成的工作传递给此构造函数?我正在寻找列表<Action>
的内容,这样我就可以在构造函数中迭代地运行每个动作而不关心它的作用,但我想不出一个合适的方法来做到这一点其中设置了变量(以及不同类型的变量)。我意识到这与DI和IOC非常接近,所以如果我想将这项工作传递到这样的课程中,也许没有办法创建容器?
public MainPageViewModel(string taskBaseLocation)
{
TasksBaseLocation = taskBaseLocation;
Type1List = TasksModel.GetType1s(TasksBaseLocation);
Type2List = TasksModel.GetType2s(TasksBaseLocation);
}
答案 0 :(得分:2)
声明一个合适的委托类型并将其传递给通用列表。
public delegate retType MyDelegate(param1type param1, param2type param2,...)
List<MyDelegate> listToPass = new List<MyDelegate>();
答案 1 :(得分:2)
由于代表是多播的,只需传递Action
:
if(action != null) { action(); }
并在来电者处结合。
如果您需要独立运行它们(例如,即使先前的操作失败也要运行以后的操作),请解构它:
if(action != null)
{
foreach(Action child in action.GetInvocationList())
{
try
{
child();
}
catch (Exception ex)
{
// handle/log etc
}
}
}
但是,请注意,除非委托的上下文已经可以访问字段(以及对新实例的引用,否则这不会神奇地提供对委托中成员变量的访问权限)通过Action<T>
代替Action
)
答案 2 :(得分:0)
我有两种方法,使用纯lambda或使用Delegate.Combine。我更喜欢lambda品种。
using System;
using System.Linq;
namespace X
{
public class MyType
{
public delegate void DoInitialize(MyType instance);
public int a,b,c;
public MyType(DoInitialize initialize)
{
initialize(this);
}
public MyType(params Action<MyType>[] initializers)
{
foreach (var initializer in initializers)
initializer(this);
}
public static void LambdaApproach()
{
var instance = new MyType(
i => i.a = 1,
i => i.b = 2,
i => i.c = 42);
Console.WriteLine("{0}, {1}, {2}", instance.a, instance.b, instance.c);
}
public static void MulticastApproach()
{
var lambdas = new DoInitialize[] {
i => i.a = 1,
i => i.b = 2,
i => i.c = 42, };
var instance = new MyType((DoInitialize) Delegate.Combine(lambdas.ToArray()));
Console.WriteLine("{0}, {1}, {2}", instance.a, instance.b, instance.c);
}
public static void Main(string[] args)
{
LambdaApproach();
MulticastApproach();
}
}
}