从发件人处获取发布者 class 字段

get publisher class field from sender

我想从发件人处获取我的字段 >>> NumberOfElementsInMyList,我该怎么做?我在这里找不到这种问题(我看到的是关于 windows 表格的问题),所以 ...

class Program
{
    static void Main(string[] args)
    {
        Publisher PublisherObject = new Publisher();
        PublisherObject.NumberAdded += PublisherObject_NumberAdded;

        PublisherObject.AddNumber(int.Parse(Console.ReadLine());
    }

    static void PublisherObject_NumberAdded(object sender, EventArgs e)
    {
        //I want to write on the console  "NumberOfElementsInMylist"

        //I tried: 

        //sender.NumberOfElementsInMylist -- not works
        //Publisher obj=(publisher)sender   and then sender.NumberOfElementsInMylist
        //not works
        Console.WriteLine("number of elements in list is ---> "+ ???? );
    }
}

class Publisher
{
    public event EventHandler NumberAdded;

    public int NumberOfElementsInMyList;

    List<int> MyList=new List<int>();

    public void AddNumber(int NumberToAdd)
    {
        MyList.Add(NumberToAdd);

        NumberOfElementsInMyList = MyList.Count;

        NumberAdded(this, new EventArgs());
    }
}

从字面上回答您的问题,您无法访问 NumberOfElementsInMyList 字段的原因是因为当您创建 EventArgs 时,您的 Publisher 实例被转换为object(你可以这样做,因为所有 类 都继承自对象。)所以要查看 Publisher 的属性(或字段),你必须将 sender 转换为Publisher.

var numberOfElements = ((Publisher)sender).NumberOfElementsInMyList;

这样做的缺点是,假设 sender 可能不是 Publisher。因为 sender 是一个 object,它在技术上可以是任何东西。

您还可以创建自己的事件处理程序委托和事件参数,而不是使用样板 EventHandler 委托。

public delegate void NumberAdded(Publisher source, NumberAddedEventArgs eventArgs);

public class NumberAddedEventArgs : EventArgs
{
    public NumberAddedEventArgs(int numberAdded, numberOfItemsInList)
    {
        NumberAdded = numberAdded;
        NumberOfItemsInList = numberOfItemsInList;
    }

    public int NumberAdded { get; private set; }
    public int NumberOfItemsInList { get; private set; }
}

public class Publisher
{
    public event EventHandler NumberAddedEvent;

    public int NumberOfElementsInMyList;

    List<int> MyList = new List<int>();

    public void AddNumber(int NumberToAdd)
    {
        MyList.Add(NumberToAdd);

        NumberOfElementsInMyList = MyList.Count;

        NumberAddedEvent?.Invoke(this, new NumberAddedEventArgs(NumberToAdd, 
            NumberOfElementsInMyList));
    }
}

var numberOfElementsInList = args.NumberOfItemsInList; // much better!

(object sender, EventArgs args) 是一个奇怪的约定。在任何其他情况下,我们将创建强类型方法和委托。但在这种情况下,倾向于使用非强类型的东西,因为这是一种约定。

您可以简单地施放 sender,不是吗?

var publisher = (Publisher)sender;
Console.WriteLine(publisher.NumberOfElementsInMyList);

或更安全:

Console.WriteLine(
    (sender as Publisher)?.NumberOfElementsInMyList?.ToString() ?? "sender is not a publisher!");