从发件人处获取发布者 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!");
我想从发件人处获取我的字段 >>> 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!");