首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何通过反射获取当前属性名称?

如何通过反射获取当前属性名称?
EN

Stack Overflow用户
提问于 2009-07-30 11:32:37
回答 8查看 31.7K关注 0票数 40

我想通过反射机制获取属性名。有可能吗?

更新:我有这样的代码:

代码语言:javascript
复制
    public CarType Car
    {
        get { return (Wheel) this["Wheel"];}
        set { this["Wheel"] = value; }
    }

因为我需要更多这样的属性,所以我想这样做:

代码语言:javascript
复制
    public CarType Car
    {
        get { return (Wheel) this[GetThisPropertyName()];}
        set { this[GetThisPropertyName()] = value; }
    }
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2009-07-30 11:44:24

由于属性实际上只是方法,因此您可以这样做并清理返回的get_:

代码语言:javascript
复制
class Program
    {
        static void Main(string[] args)
        {
            Program p = new Program();
            var x = p.Something;
            Console.ReadLine();
        }

        public string Something
        {
            get
            {
                return MethodBase.GetCurrentMethod().Name;
            }
        }
    }

如果你分析一下性能,你会发现MethodBase.GetCurrentMethod()比StackFrame快很多。在.NET 1.1中,在发布模式下的StackFrame也会有问题(从内存上看,我发现它快了3倍)。

也就是说,我相信性能问题不会造成太大的问题--尽管关于StackFrame速度缓慢的一个有趣的讨论可以是found here

我想,如果您关心性能,另一个选择是创建一个Visual Studio Intellisense代码片段,该代码片段为您创建属性并创建与属性名称相对应的字符串。

票数 54
EN

Stack Overflow用户

发布于 2017-02-08 00:52:11

你给出的例子有点让人困惑,除非我就是不明白。在C# 6.0中,您可以使用nameof运算符。

代码语言:javascript
复制
public CarType MyProperty
{
    get { return (CarType)this[nameof(MyProperty)]};
    set { this[nameof(MyProperty)] = value]};
}

如果你有一个方法来处理你的getter/setter,你可以使用C# 4.5的CallerMemberName属性,在这种情况下你甚至不需要重复这个名字。

代码语言:javascript
复制
public CarType MyProperty
{
    get { return Get<CarType>(); }
    set { Set(value); }
}

public T Get<T>([CallerMemberName]string name = null)
{
    return (T)this[name];
}   

public void Set<T>(T value, [CallerMemberName]string name = null)
{
    this[name] = value;
}  
票数 10
EN

Stack Overflow用户

发布于 2009-07-30 11:42:05

我想更多地了解你需要它的上下文,因为在我看来,你应该已经知道你在属性访问器中使用的是什么属性。但是,如果必须这样做,您可以使用MethodBase.GetCurrentMethod().Name并删除get_/set_之后的所有内容。

更新

根据您所做的更改,我认为您应该使用继承而不是反射。我不知道你的字典里有什么数据,但在我看来,你真的希望有不同的汽车类别,比如轿车,跑车,四驱车,StationWagon,而不是把类型保存在一个局部变量中。然后,您将拥有为该类型的汽车做适当事情的方法的实现。而不是找出你的车的类型,然后做一些事情,然后你只需调用适当的方法,汽车对象就会根据它的类型做正确的事情。

代码语言:javascript
复制
 public interface ICar
 {
      void Drive( decimal velocity, Orientation orientation );
      void Shift( int gear );
      ...
 }

 public abstract class Car : ICar
 {
      public virtual void Drive( decimal velocity, Orientation orientation )
      {
          ...some default implementation...
      }

      public abstract void Shift( int gear );

      ...
 }

 public class AutomaticTransmission : Car
 {
       public override void Shift( int gear )
       {
          ...some specific implementation...
       }
 }

 public class ManualTransmission : Car
 {
       public override void Shift( int gear )
       {
          ...some specific implementation...
       }
 }
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1206023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档