带有强类型对象的事件回调
本文关键字:事件 回调 对象 强类型 | 更新日期: 2023-09-27 18:15:48
我正试图为我的代码中需要的功能获得概念证明。在实际的应用程序中,我有一个依赖注入容器,子对象有时需要"新建"一个对象,而我需要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();
}
}
和事件参数:
public class MyEventArgs
{
public Action<object> Callback { get; set; }
public MyEventArgs(Action<object> callback)
{
Callback = callback;
}
}
我卡住了,因为MyEventArgs
不能接受类型参数,因为我真的希望只有一个事件来处理任何返回对象类型。是否有可能通过回调获得强类型对象?
同样,我可以发送Type
作为参数,并强制转换它,但我觉得这应该是可行的。这也完全有可能是不可能的。
谢谢你的指导
我想出了一个解决方案几乎正是我想要的:
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);
}
and in my Main:
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
参数不是强类型的。但是它非常接近我想要的。
您可能想看看动态类型。
public class MyEventArgs
{
public Action<dynamic> Callback { get; set; }
public MyEventArgs(Action<dynamic> callback)
{
Callback = callback;
}
}
它将允许你传递任何类型的回调