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

时间:2015-10-02 15:31:30

标签: c# events generics callback

我试图在我的代码中获取我需要的功能的概念证明。在实际的应用程序中,我有一个依赖注入容器,孩子有时需要新的'一个对象,我需要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作为参数发送,然后投射,但我觉得这应该是可行的。完全有可能这也是不可能的。

感谢任何指导。

2 个答案:

答案 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参数不是强类型的。但它与我想要的非常接近。