C#提取对象的局部变量名。不是通用的类名

时间:2014-10-12 19:17:26

标签: c# .net

C#.net 4.5
Visual Studio 2013 Update 3
Windows NT 6.3 build 9200(Windows 8.1家庭高级版)i586

寻找提取对象当前局部变量名称的方法/过程。不是班级名称。

以下代码示例显示了类,即Beast,SonOfBeast,GrandSonOfBeast和this.GetType().Name ......但我正在寻找一种方法来提取当前对象名称,即Monkey,MonkeyJr,MonkeyIII而不传递一个ID标签。

namespace WhoAreYou { class Program { static void Main(string[] args) // Example using Inheritance { Console.WriteLine("~~~~Who is that masked beast~~~~");

        Beast Monkey = new Beast();
        Monkey.Prowl();

        SonOfBeast MonkeyJr = new SonOfBeast();
        MonkeyJr.Prowl();

        GrandSonOfBeast MonkeyIII = new GrandSonOfBeast();
        MonkeyIII.Prowl();

        Console.ReadKey();
    }
}

class SonOfBeast:Beast{ }
class GrandSonOfBeast:SonOfBeast{ }

class Beast
{
    public void Prowl()
    {
        int frequency, duration;
        Console.Write("Your {0} is loose again! ", this.GetType().Name);
        for (int i = 0; i < 3; i++)
        {
            Console.Write(".~.>  ");
            System.Threading.Thread.Sleep(125);    // 0.125 second
            for (int j = 37; j <= 637; j += 300)
            {
                if (j < 637) {frequency = j; duration = 660 - j;}
                else 
                   {frequency = j - 480; duration = j / 2;}
                Console.Beep(frequency, duration);
            }
        }
        Console.WriteLine(); 
    }
}

Beast Monkey = new Beast(); Monkey.Prowl(); SonOfBeast MonkeyJr = new SonOfBeast(); MonkeyJr.Prowl(); GrandSonOfBeast MonkeyIII = new GrandSonOfBeast(); MonkeyIII.Prowl(); Console.ReadKey(); } } class SonOfBeast:Beast{ } class GrandSonOfBeast:SonOfBeast{ } class Beast { public void Prowl() { int frequency, duration; Console.Write("Your {0} is loose again! ", this.GetType().Name); for (int i = 0; i < 3; i++) { Console.Write(".~.> "); System.Threading.Thread.Sleep(125); // 0.125 second for (int j = 37; j <= 637; j += 300) { if (j < 637) {frequency = j; duration = 660 - j;} else {frequency = j - 480; duration = j / 2;} Console.Beep(frequency, duration); } } Console.WriteLine(); } }

2 个答案:

答案 0 :(得分:7)

对象没有名称。变量具有名称,但多个变量可以具有引用同一对象的值。例如:

Beast monkey = new Beast();
Beast donkey = monkey;

现在他们都引用了同一个对象 - 所以如果一种获取对象名称的方法,它会返回什么?有时根本就没有名字......

如果您希望对象具有名称的概念,则应自行提供。例如:

public sealed class Beast
{
    private readonly string name;

    public string Name { get { return name; } }

    public Beast(string name)
    {
        this.name = name;
    }
}

然后你可以使用:

Beast x = new Beast("Monkey");
Console.WriteLine(x.Name); // Prints "Monkey"

答案 1 :(得分:3)

您可以通过多种方式为猫咪涂抹皮肤。这完全取决于您的要求,具体设计可能适用。想到两个选项是

  1. 您需要为MonekyPig等设置不同的行为。 这意味着,您将使用适当的名称创建新类,这将扩展Beast类。 在这种情况下,以下工作

    class Monkey : Beast
    {
        public void MonkeyBehavior()
        {
            ....
        }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            Monkey monkey = new Monkey();
            Pig pig = new Pig();
            Rino rino = new Rino();
            monkey.Prowl(); pig.Prowl(); rino.Prowl();
            Console.ReadKey();
        }
    }
    
  2. 另一个选项是,所有Beast只是Beast,行为没有区别,但只有不同的属性值,比方说Specie。 在这种情况下,只需将此属性添加到Beast类,您可以在构造Beast类的实例时进行设置,并在引用这些实例的任何位置读取它们。