取消装箱后无法访问类的成员

Cha*_*lie 1 c# events unboxing object

我正在学习高级C#.在下面的代码中,我正在尝试进行事件处理

我在取消装箱后访问类发件人的成员时遇到错误//编译器不允许我使用这些名称

//    Console.WriteLine("Sender is {0} and message is {1}",obj.name,obj.messgae);
Run Code Online (Sandbox Code Playgroud)

为什么会这样?这就是我们所说的拳击和拆箱,如果我不会感到困惑.

在我到目前为止所做的所有示例中,都有事件类继承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();

            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

善意评论我的编码风格和含糊之处.提前致谢

Jon*_*eet 8

这就是问题:

object obj=new object();
obj=sender as Sender;
Run Code Online (Sandbox Code Playgroud)

第二行不改变编译时类型obj.它仍然只是object.(并且你创建一个新的第一行object是完全没有意义的.)编译器不关心你在obj尝试使用时所做的事情obj.name- 它关心编译时类型.你要:

Sender obj = (Sender) sender;
Run Code Online (Sandbox Code Playgroud)

(请参阅我最近的博客文章,了解为什么演员比as在这里使用更合适.)

想使用的公共属性,而不是私有字段:

Console.WriteLine("Sender is {0} and message is {1}", obj.Name, obj.Message);
Run Code Online (Sandbox Code Playgroud)

请注意,顺便说一下,这个转换不是拆箱 - 你没有涉及任何值类型(Sender是一个类)所以不涉及装箱或拆箱.