带有强类型对象的事件回调

本文关键字:事件 回调 对象 强类型 | 更新日期: 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;
    }
}

它将允许你传递任何类型的回调