c# - 拆箱后无法访问类(class)成员

标签 c# events object unboxing

我正在学习高级 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/

相关文章:

c# - 如何使用 @Html.TextBoxFor 的用户输入设置 @Html.RadioButtonFor 的值?

c# - 获取被点击的ListView项目属性

vba - 如何根据特定范围内不同单元格的值自动启动宏

c++ - 使用 union hack c++ 进行事件处理

php - 在 php 中使用多维数组和对象

c# - 无需重新编译项目的本地化

c# - 格式化复选框?

java - 如何在Android上将对象从一个 Activity 传递到另一个 Activity

c# - .NET : Is creating new EventArgs every time the event fires a good practice?

javascript - 向 KineticJS 对象添加属性