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();
}
}
答案 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)
您可以通过多种方式为猫咪涂抹皮肤。这完全取决于您的要求,具体设计可能适用。想到两个选项是
您需要为Moneky
,Pig
等设置不同的行为。
这意味着,您将使用适当的名称创建新类,这将扩展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();
}
}
另一个选项是,所有Beast
只是Beast
,行为没有区别,但只有不同的属性值,比方说Specie
。
在这种情况下,只需将此属性添加到Beast
类,您可以在构造Beast
类的实例时进行设置,并在引用这些实例的任何位置读取它们。