【问题标题】:Event Callback with Strongly Typed Object具有强类型对象的事件回调
【发布时间】:2025-12-18 23:40:01
【问题描述】:

我正在尝试为我的代码中需要的功能获取概念证明。在实际的应用程序中,我有一个依赖注入容器,孩子们有时需要“新建”一个对象,我需要 DI 容器来返回该对象。所以我使用了一个带有回调的事件,它可以让孩子获得那个 instatiated 对象。

问题是,我想要一个事件,但允许它返回调用者指定的任何对象。我不确定如何取回该强类型对象(不进行强制转换)。我觉得应该可以。如果这足够令人困惑,这是我的例子:

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 作为参数发送,然后进行转换,但我觉得这应该是可行的。完全有可能这也是不可能的。

感谢您的指导。

【问题讨论】:

  • 这就是问题所在。您如何看待可以采用任何类型的参数同时又是强类型的函数签名?
  • @Vova 就像我说的,这完全有可能做不到。
  • 据我所知,您尝试做的具体事情无法完成。但总的来说,您想要实现的目标听起来像是工厂模式:en.wikipedia.org/wiki/Factory_method_pattern
  • @Vova,我想出了一个近乎理想的解决方案

标签: c# events generics callback


【解决方案1】:

我想出了一个几乎正是我想要的解决方案:

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

【讨论】:

    【解决方案2】:

    您可能想看看dynamic types

    public class MyEventArgs 
    {
        public Action<dynamic> Callback { get; set; }
    
        public MyEventArgs(Action<dynamic> callback)
        {
            Callback = callback;
        }
    }
    

    它将允许您将任何类型传递给回调。

    【讨论】:

    • 不,这就是我要避免的。如果我这样做了,我需要每个对象都有一个独特的事件。不过谢谢你的想法。
    最近更新 更多