我是这个话题的新手,我想知道有没有一种方法可以在使用多播委托的返回类型时获得所有方法的结果,而不仅仅是最后一个方法的结果?

以下是我的代码:

class Program
    {
        public delegate double rectangleDelegate (double Width, double Heigth);
        class Rectangle
        {
            public double GetPerimeter(double Width, double Heigth)
            {
                return 2 * (Width + Heigth);
            }
            public double GetArea(double Width, double Heigth)
            {
                return Width * Heigth;
            }
        }
        static void Main(string[] args)
        {
            Rectangle rectangle = new Rectangle();

            rectangleDelegate obj = rectangle.GetArea;
            obj += rectangle.GetPerimeter;

            Console.WriteLine(obj(4, 2));

        }
    }

我try 用void作为我的方法和委托,并打印结果.在本例中,我可以在控制台上看到这两种方法的输出.但是当使用像double这样的返回类型时,我只得到最后一个方法的输出.

我可以做些什么来获取每个方法的返回并将其存储在变量或列表中吗? 或者,从多播代表那里期待这样的事情是完全错误的方法?

推荐答案

您不能像这样获得所有返回值.我知道的唯一方法就是用GetInvocationList:

rectangleDelegate obj = rectangle.GetArea;
obj += rectangle.GetPerimeter;

foreach(var del in obj.GetInvocationList())
{
    var result = (double)del.DynamicInvoke(4, 2);
    Console.WriteLine(result);
}

当然,这有点危险,因为它假定代表的是特定的格式.您可以将代理强制为您使用的类型,这意味着您不需要使用DynamicInvoke:

foreach(rectangleDelegate del in obj.GetInvocationList())
{
    var result = del(4, 2);
    Console.WriteLine(result);
}

或者一个更安全的版本:

foreach(var del in obj.GetInvocationList().OfType<rectangleDelegate>())
{
    var result = del(4, 2);
    Console.WriteLine(result);
}

Csharp相关问答推荐

Rx.Net -当关闭序列被触发时如何聚合消息并发出中间输出?

dotnet集合中内部数组的局部变量副本的用途是什么?'

.NET 8 Web-API返回空列表

Take()方法如何与IAsyncEnumerable一起使用

使用预定义对象减少Task.Run/Factory.StartNew中的关闭开销

在swagger示例中添加默认数组列表

在IAsyncEnumerable上先调用,然后跳过(1)可以吗?

未在数据流块之间传播完成

如何在CSharp中将json字符串转换为DataTable?

发布.NET 8 Blazor WebAssembly独立应用程序以进行静态站点部署

如何对特定异常使用Polly重试机制?

Visual Studio,Docker容器-容器调用:连接被拒绝

在构造函数中传递C#函数以用作EventHandler委托的订阅服务器

并发表更新.EF核心交易

为什么连接到Google OAuth2后,结果.Credential为空?

当要删除的子模型没有父模型的1:多属性时,如何告诉实体框架设置1:1 FK条目?

客户端/服务器RPC如何处理全局变量?

C#中的逻辑运算符用作单词';is';and';and';

使用生产环境调试我的应用程序的快速方法

在Swagger中显示自定义属性的属性名称