我想通过反射机制获取属性名。有可能吗?
更新:我有这样的代码:
public CarType Car
{
get { return (Wheel) this["Wheel"];}
set { this["Wheel"] = value; }
}因为我需要更多这样的属性,所以我想这样做:
public CarType Car
{
get { return (Wheel) this[GetThisPropertyName()];}
set { this[GetThisPropertyName()] = value; }
}发布于 2009-07-30 11:44:24
由于属性实际上只是方法,因此您可以这样做并清理返回的get_:
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代码片段,该代码片段为您创建属性并创建与属性名称相对应的字符串。
发布于 2017-02-08 00:52:11
你给出的例子有点让人困惑,除非我就是不明白。在C# 6.0中,您可以使用nameof运算符。
public CarType MyProperty
{
get { return (CarType)this[nameof(MyProperty)]};
set { this[nameof(MyProperty)] = value]};
}如果你有一个方法来处理你的getter/setter,你可以使用C# 4.5的CallerMemberName属性,在这种情况下你甚至不需要重复这个名字。
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;
} 发布于 2009-07-30 11:42:05
我想更多地了解你需要它的上下文,因为在我看来,你应该已经知道你在属性访问器中使用的是什么属性。但是,如果必须这样做,您可以使用MethodBase.GetCurrentMethod().Name并删除get_/set_之后的所有内容。
更新
根据您所做的更改,我认为您应该使用继承而不是反射。我不知道你的字典里有什么数据,但在我看来,你真的希望有不同的汽车类别,比如轿车,跑车,四驱车,StationWagon,而不是把类型保存在一个局部变量中。然后,您将拥有为该类型的汽车做适当事情的方法的实现。而不是找出你的车的类型,然后做一些事情,然后你只需调用适当的方法,汽车对象就会根据它的类型做正确的事情。
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...
}
}https://stackoverflow.com/questions/1206023
复制相似问题