Есть ли способ вернуть значение от подписчика на событие - PullRequest
0 голосов
/ 18 октября 2018

После того, как я подпишусь на какое-то пользовательское событие, которое возвращает значение, как мне получить это возвращаемое значение?(productDetails внутри Logger)

void Logger()
{ 
    cart.ProductAddedEvent += DisplayAddedProduct;  
    //how do I get productDetails from DispalyAddedProduct() 
} 

string DisplayAddedProduct(NewProductArgs args)  
{  
    string productDetails = $"{args.Product.name} {args.Product.Price}";
    return productDetails  
}

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Вы можете добавить свои возвращаемые значения как свойство класса NewProductArgs и прочитать их после вызова события.

Примерно так:

class NewProductArgs: EventArgs
{
    public IList<string> ReturnValues { get; } = new List<string>();
    public Product Product { get; set; }
}

class Product
{
    public string Name { get; set; }
    public decimal Price { get; set; }
}

class Cart
{
    public event EventHandler<NewProductArgs> ProductAddedEvent;
    public void Add(Product product)
    {
        var args = new NewProductArgs { Product = product };
        ProductAddedEvent?.Invoke(this, args);
        var retvals = args.ReturnValues; 
        foreach (var ret in retvals)
        {
            Console.WriteLine(ret);
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        var cart = new Cart();
        cart.ProductAddedEvent += DisplayAddedProduct;
        cart.ProductAddedEvent += AnotherEventHandler;

        cart.Add(new Product { Name = "Product-1", Price = 100.0m });
        cart.Add(new Product { Name = "Product-2", Price = 200.0m });
    }

    static void AnotherEventHandler(object sender, NewProductArgs args)
    {
        args.ReturnValues.Add($"Handler2: {args.Product.Name} {args.Product.Price}");
    }

    static void DisplayAddedProduct(object sender, NewProductArgs args)
    {
        args.ReturnValues.Add($"Handler1 : {args.Product.Name} {args.Product.Price}");
    }
}
0 голосов
/ 18 октября 2018

GetInvocationList Возвращает список вызовов этого многоадресного делегата в порядке вызова.

Хотя события не возвращают значения назад, это возможно в соответствии с необходимостью

        static event Func<NewProductArgs, string> ProductAddedEvent;

        static void Main(string[] args)
        {
            ProductAddedEvent += Program_ProductAddedEvent;

            var productDelegate = ProductAddedEvent?.GetInvocationList().FirstOrDefault();

            productDelegate?.DynamicInvoke();
        }

        private static string Program_ProductAddedEvent(NewProductArgs arg)
        {
            return $"{args.Product.name} {args.Product.Price}";
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...