1

我正在学习高级 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();

            }
        }
    }

请评论我的编码风格和歧义。提前致谢

4

3 回答 3

8

这就是问题:

object obj=new object();
obj=sender as Sender;

第二行不会更改. obj它仍然只是object。(而且你创建一个新的第一行是完全没有意义的。)当你尝试使用时object,编译器并不关心你做了什么——它关心的是编译时类型。你要:objobj.name

Sender obj = (Sender) sender;

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

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

Console.WriteLine("Sender is {0} and message is {1}", obj.Name, obj.Message);

请注意,顺便说一下,这种转换不是拆箱 - 您没有涉及值类型(Sender是一个类),因此不涉及装箱或拆箱。

于 2013-09-20T13:07:49.973 回答
2

您的问题是您假设obj=sender as Sender;将更改obj. 它不会。它将保持声明它的类型,即object. 这里:object obj = new object();

代替:

object obj = new object();
obj= sender as Sender;

和:

var obj = sender as Sender;

或者你可以直接施放它:

((Sender)obj).MySenderProperty
于 2013-09-20T13:08:49.123 回答
0

使用 Sender 作为类名是一个坏主意,但以下是获取类 Sender 对象的正确方法:

Sender obj = sender as Sender;

但是就像我说的那样,我永远不会这样做,以避免在您的示例中使用“对象发送者”中常用的名称。

于 2013-09-20T13:11:03.740 回答