首页 > 解决方案 > 从属性类型中获取属性名称

问题描述

我无法弄清楚如何更好地制定标题。我看到很多标题相似但讨论完全不同的东西的帖子。

所以我们开始吧。实际的地面情况很复杂,但我将尝试发布一个绝对简约的示例来描述它。

假设我们有一个名为的类Animal

class Animal
{
  public void Run()
  {
    try
    {
      //try running
    }
    catch(Exception e)
    {
      MessageBox.Show(this.SomeCleverWayOfGettingPropertyName() + " failed to run");
    }
  }
}

Animal现在我在另一个类中定义了几个类型的属性:

class Zoo
{
  public Animal Zebra {get; set;}
  public Animal Lion {get; set;}
  public Animal Rhino {get; set;}

  public void RunAll()
  {
    Zebra.Run();
    Lion.Run();
    Rhino.Run();
  }
}

我要写什么来代替SomeCleverWayOfGettingPropertyName()它显示动物的名称(即声明的属性的名称),例如“斑马无法运行”。

正如我所说,实际情况更复杂,所以请避免回答“为什么不重新设计整个代码库,而是尝试 X”之类的答案。我希望找到一些东西 System.Reflection来找出主叫成员的名字,但我还没有找到类似的东西。

标签: c#.netreflection

解决方案


理想情况下,你会重新考虑你的问题,并可能在跑步之外抓住

根据您的确切需求,表达式可能会起作用。但是,这确实是一个糟糕的解决方案,如果您竭尽全力,不妨在外面赶上,或者只是将成员名称传递进去。

给定

public class Animal
{
   public void Run()
   {
      Console.WriteLine("Running");
   }
}

public static class MemberInfoGetting
{
   public static void Run<T>(this Expression<Func<T>> memberExpression) where T : Animal
   {
      var expressionBody = (MemberExpression)memberExpression.Body;
      try
      {

         var animal = Expression.Lambda<Func<Animal>>(expressionBody).Compile()();
         animal.Run();
         throw new Exception("bob");
      }
      catch
      {
         Console.WriteLine($"{expressionBody.Member.Name} : failed to run");
      }
   }
}

用法

public static Animal Rhino { get; set; } = new Animal();

public static void Main()
{
   MemberInfoGetting.Run(() => Rhino);
}

输出

Running
Rhino : failed to run

推荐阅读