【问题标题】:Checking the method caller's field in C#在 C# 中检查方法调用者的字段
【发布时间】:2013-10-02 16:23:11
【问题描述】:
class Dog
{
 public void Bark()
  {
    Console.WriteLine("<Name_Of_Dog> just barked!")
  }
}

static void Main()
{
  Dog Spike=new Dog();
  Dog Mike=new Dog();
  Spike.Bark();
}

现在我希望控制台输出为:“Spike just barked!” 我该怎么做?

【问题讨论】:

  • 在您的类中创建一个名为“Name”的字符串属性并手动分配名称。 不要使用变量名来保存逻辑。
  • 根本不可能按照建议使用 Name 属性
  • 您不想检查变量的名称。同一个对象可以被多个具有不同名称的变量引用,或者它可以在一个集合中并且没有自己的唯一名称。
  • @Pierre-LucPineault 反射也不可能。如果你相信是的证明它。您只能使用Mono.Cecil 或其他方式打开IL
  • @SriramSakthivel 是的,几分钟前删除了评论,我暂时忘记了他使用的变量名,而不是类名。

标签: c# methods field


【解决方案1】:

改用属性或字段:

class Dog
{
   string Name
   public void Bark()
   {
     Console.WriteLine("{0} just barked!", Name)
   }
   public Dog(string name)
   {
     this.Name=name;
   }
}

static void Main()
{
  Dog Spike=new Dog("Spike");
  Dog Mike=new Dog("Mike");
  Spike.Bark();
}

【讨论】:

    【解决方案2】:

    开发人员使用变量的名称。它用于交流,揭示此变量存在的原因、作用以及使用方式。业务逻辑应该与变量名完全无关。

    在这种情况下:object potato = new Object(),并不是因为我将我的对象命名为土豆,它就自动变成了一个。在您的示例中,使用这样的狗名称仅向开发人员表明此 Dog 实例名为 Spike,而不是它所代表的实际对象是一只名为 Spike 的狗。

    您需要的是通过propertiesfields 定义对象的特征。 对于您的情况,您需要一个名为 Name 的字段。为什么不是财产?因为对象就像间谍,它们希望对全世界隐藏一切。由于您没有在应用程序的其他地方使用该名称,因此请限制类级别的范围:

    class Dog
    {
        private readonly string name;
    
        public Dog(string name)
        {
            this.name = name;
        }
    
        public void Bark()
        {
            Console.WriteLine("{0} just barked!", name);
        }
    }
    

    还有主要的:

    Dog Spike = new Dog("Spike");
    

    有了一个属性,它看起来像这样:

    class Dog
    {
        public string Name { get; set; }
    
        public void Bark()
        {
            Console.WriteLine("{0} just barked!", Name);
        }
    }
    

    而主要变成:

    Dog Spike = new Dog { Name = "Spike" };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-03
      • 1970-01-01
      • 2010-11-12
      • 1970-01-01
      相关资源
      最近更新 更多