我试图在我的代码中获取我需要的功能的概念证明。在实际的应用程序中,我有一个依赖注入容器,孩子有时需要新的'一个对象,我需要DI容器来返回该对象。所以我使用一个带回调的事件让孩子得到那个实例化的对象。
问题是,我喜欢一个事件,但允许它返回调用者指定的任何对象。我不知道如何获得强类型对象(没有强制转换)。我觉得它应该是可能的。如果这让人感到困惑,这就是我的例子:
class Program
{
public static event EventHandler<MyEventArgs> MyEvent;
public static void Main()
{
MyEvent += (sender, args) =>
{
Console.WriteLine("Event Fired");
args.Callback("hello");
};
MyEvent(null, new MyEventArgs(obj => Console.WriteLine($"How do I get {obj} strongly typed")));
Console.Read();
}
}
和事件args:
public class MyEventArgs
{
public Action<object> Callback { get; set; }
public MyEventArgs(Action<object> callback)
{
Callback = callback;
}
}
我被卡住了,因为MyEventArgs
无法接受类型参数,因为我真的只想要一个事件来处理任何返回对象类型。是否可以通过回调获得强类型对象?
同样,我可以将Type
作为参数发送,然后投射,但我觉得这应该是可行的。完全有可能这也是不可能的。
感谢任何指导。
答案 0 :(得分:0)
您可能想看看dynamic types。
public class MyEventArgs
{
public Action<dynamic> Callback { get; set; }
public MyEventArgs(Action<dynamic> callback)
{
Callback = callback;
}
}
它允许您传递任何类型的回调。
答案 1 :(得分:0)
我制定了一个几乎的解决方案,完全符合我的目标:
public class MyEventArgs<T> : MyEventArgs where T : class
{
private Action<T> _callback;
public MyEventArgs(Action<T> callback)
{
_callback = callback;
}
public override void DoCallback(object item)
{
_callback(item as T);
}
}
public abstract class MyEventArgs
{
public abstract void DoCallback(object item);
}
在我的主要地方:
public static event EventHandler<MyEventArgs> MyEvent;
public static void Main()
{
MyEvent += (sender, args) =>
{
Console.WriteLine("Event Fired");
args.DoCallback("hello");
};
MyEvent(null, new MyEventArgs<string>(s => Console.WriteLine($"{s} is a string")));
Console.Read();
}
缺少的是DoCallback()'s
参数不是强类型的。但它与我想要的非常接近。