WPF/XAML не обеспечивает эту функциональность исходно, но это действительно обеспечивает расширяемость, чтобы позволить Вам делать то, что Вы хотите.
Мы столкнулись с той же потребностью и закончили тем, что создали наше собственное Расширение Разметки XAML (который мы назвали "MergedStylesExtension"), чтобы позволить нам создавать новый стиль из двух других стилей (который, в случае необходимости, мог, вероятно, использоваться многократно подряд для наследования еще большему количеству стилей).
из-за ошибки WPF/XAML, мы должны использовать синтаксис элемента свойства для использования его, но кроме которого это, кажется, работает хорошо. Например,
я недавно записал об этом здесь: http://swdeveloper.wordpress.com/2009/01/03/wpf-xaml-multiple-style-inheritance-and-markup-extensions/
Поскольку свойства на самом деле являются просто методами, вы можете сделать это и очистить 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 можно найти здесь .
Используйте вместо него MethodBase.GetCurrentMethod ()!
Отражение используется для работы с типами, которая не может быть выполнена во время компиляции. Получение имени метода доступа к свойству, в котором вы находитесь, можно решить во время компиляции, поэтому вам, вероятно, не следует использовать для него отражение.
Вы можете использовать имя метода доступа из стека вызовов с помощью System.Diagnostics. Однако StackTrace
.
string GetPropertyName()
{
StackTrace callStackTrace = new StackTrace();
StackFrame propertyFrame = callStackTrace.GetFrame(1); // 1: below GetPropertyName frame
string properyAccessorName = propertyFrame.GetMethod().Name;
return properyAccessorName.Replace("get_","").Replace("set_","");
}
Я хотел бы больше узнать о контексте, в котором он вам нужен, поскольку мне кажется, что вы уже должны знать, с каким свойством вы работаете в инструменте доступа к свойству. Однако при необходимости вы, вероятно, могли бы использовать MethodBase.GetCurrentMethod () .Name и удалить что-либо после get_ / set_
.
Обновление :
На основе ваши изменения, я бы сказал, что вы должны использовать наследование, а не отражение. Я не знаю, какие данные есть в вашем словаре, но мне кажется, что вы действительно хотите иметь разные классы автомобилей, скажем, Sedan, Roadster, Buggy, StationWagon, а не сохранять тип в локальной переменной. Тогда у вас будут реализации методов, которые подходят для этого типа автомобилей. Вместо того, чтобы выяснять, какая у вас машина, а затем что-то делать, затем вы просто вызываете соответствующий метод, и объект Car выполняет правильные действия в зависимости от его типа.
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...
}
}
Да, это так!
string test = "test string";
Type type = test.GetType();
PropertyInfo[] propInfos = type.GetProperties();
for (int i = 0; i < propInfos.Length; i++)
{
PropertyInfo pi = (PropertyInfo)propInfos.GetValue(i);
string propName = pi.Name;
}
Попробуйте использовать System.Diagnostics. StackTrace
для отражения в стеке вызовов. Свойство должно быть где-то в стеке вызовов (возможно, вверху, если вы вызываете его непосредственно из кода свойства).