我正在学习高级 C#。在下面的代码中,我正在尝试进行事件处理
拆箱后访问类发件人成员时出错
//编译器不允许我使用这些名称
// Console.WriteLine("Sender is {0} and message is {1}",obj.name,obj.messgae);
为什么呢?
如果我没有感到困惑,那就是我们所说的装箱和拆箱。
到目前为止,在我所做的所有示例中,都有一个事件类继承了 EventArgs。该类需要什么。虽然在这里我没有使用过这个类,但我直接使用了Eventargs(刚刚制作)。
namespace ConsoleApplication5
{
class eventclass : EventArgs
{
string var;
}
delegate void GenerateEvent(object source, EventArgs e);
class Sender
{
public void MyMethod()
{
Console.WriteLine("My method Called");
}
private string name;
public string Name
{
get
{
return name;
}
set
{
name = value;
}
}
private string message;
public string Message
{
get
{
return message;
}
set
{
message = value;
}
}
public event GenerateEvent OnAlert;
public void Sendit()
{
Console.WriteLine("Sender: Sending Message Now");
OnAlert(this, new EventArgs());
Console.WriteLine("Sender: Message Sent");
}
}
class Receiver
{
public static void ReceiveMsg(object sender, EventArgs e)
{
Console.WriteLine("Receiveing Message");
object obj = new object();
obj = sender as Sender;
/*Here i get Error while accessing members of class sender after unboxing
//Compiler is not letting me use these names
// Console.WriteLine("Sender is {0} and message is {1}",obj.name,obj.messgae);
*/
Console.WriteLine("Received" + obj.GetType());
}
}
class Program
{
static void Main(string[] args)
{
Receiver r = new Receiver();
Sender s = new Sender();
s.OnAlert += new GenerateEvent(Receiver.ReceiveMsg);
s.Sendit();
}
}
}
请评论我的编码风格和歧义。提前致谢
最佳答案
这就是问题:
object obj=new object();
obj=sender as Sender;
第二行不改变
obj
的编译时类型.它仍然只是 object
. (而您创建新 object
的第一行完全没有意义。)编译器不在乎您对 obj
做了什么。当您尝试使用 obj.name
- 它关心编译时类型。你要:Sender obj = (Sender) sender;
(请参阅我的 recent blog post,了解为什么类型转换比使用
as
更可取。)您还想使用公共(public)属性而不是私有(private)字段:
Console.WriteLine("Sender is {0} and message is {1}", obj.Name, obj.Message);
请注意,顺便说一下,此转换不是拆箱 - 您没有涉及值类型(
Sender
是一个类),因此不涉及装箱或拆箱。
关于c# - 拆箱后无法访问类(class)成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18917537/